笔记整理(六)

JS中的隐式类型转换

  • 数字运输符

    1
    2
    3
    4
    5
    6
    7
    var a = 123, b = '4';
    var c = a + b;
    console.log(c); // '1234'
    typeof c; // string
    typeof (a + '') // string
    typeof (+b) // number
    console.log(a - b) // 119
  • if/while语句中的判断

    1
    2
    3
    4
    5
    var obj = {name: 'snk'};
    // obj被转换成了Boolean值
    if (obj) {
    //do sth;
    }
  • 相等操作符==

    1
    2
    var a = 123, b = '123';
    console.log(a == b); // true 这里相等操作符做了隐式类型转换,建议永远使用全等操作符===

JS中的类型识别方法

  • typeof: 可以识别标准类型(null由于历史原因显示为object);不能识别具体对象类型(function除外)
  • instanceof: 可以识别内置对象类型和自定义对象类型;不能识别标准对象类型
  • Object.prototype.toString: 可以识别标志类型和内置对象类型;不能识别自定义对象类型
  • constructor: 可以识别标志类型(null和undefined除外);可以识别内置对象和自定义对象 >>在线demo

函数声明和函数表达式的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 函数声明
function test1() {
say();
function say() {
console.log('我是函数声明,命名和函数体整个被提升到作用域顶部');
}
}
test1(); // 我是函数声明,命名和函数体整个被提升到作用域顶部
// 函数表达式
function test2() {
say();
var say = function() {
console.log('我被提升的只是变量名say,所以无法显示会出错');
};
}
test2(); // 会报错(say is not a function),因为函数表达式只有命名被提升,定义的函数体不会被提升

假值

  • false
  • null
  • undefined
  • 空字符串
  • 数字0
  • NaN
  • 剩余的都是真值

++ii++的区别

1
2
3
4
5
6
7
8
var i = 1;
var a;
// a = ++i;
a = i++;
console.log(a);
console.log(i);
// a = ++i 这时a = 2, i = 2 ++i返回自加之后的对象i
// a = i++ 这时a = 1, i = 2 i++返回i在自加之前的值

二分法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
题目
// 函数search用于在一个已排序的数字数组中查找指定数字。
// 语法如下:
// var index = search(arr, dst);
// 使用范例如下:
// var arr = [1, 2, 4, 6, 7, 9, 19,20, 30, 40, 45, 47];
// search(arr, 45); 返回值: 10
// 请写出函数search的实现代码 请给出函数,要求不能使用Array的原型方法,且算法时间复杂度低于O(n)。
/** 利用二分搜索,核心理念就是对半切,根据高了或者低了调整区间再对半切,直到找到该项
* 利用二分法的前提是数组要已经排序
*定义low为数组的第一项、high为数组的最后一项、mid为数组的中间项、midElement为中间项对应的数值
*当low小于等于high时,通过Math.floor计数mid,然后把arr[mid]赋值给midElement
*通过比较midElemnet和dst的大小,如果midElement小于dst,说明dst在mid的右边,设置low的值为mid + 1
*如果midElement大于dst,说明dst在mid的左边,设置high的值为mid - 1
*除了大于和小于以外的情况就是等于了,说明此时midElement等于dst,mid就是dst要找的序列号,返回mid
*在while循环外,也就是low大于high的情况,说明找不到该对象,返回-1
*
*
*
* @param arr 传入的数组
* @param dst 在数组中寻找的对象
* @return 返回dst在数组中的序列号
*/
function search(arr, dst) {
var low = 0,
high = arr.length - 1,
mid,
midElement;
while (low <= high) {
mid = Math.floor((low + high) / 2);
midElement = arr[mid];
if (midElement < dst) {
low = mid + 1;
} else if (midElement > dst) {
high = mid - 1;
} else {
return mid;
}
}
return -1 ;
}
// 测试
var arr = [1, 2, 4, 6, 7, 9, 19,20, 30, 40, 45, 47];
console.log(search(arr, 45)); // 返回值: 10

在线demo

一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?

  1. 浏览器会开启一个线程来处理这个请求,对 URL 分析判断如果是 http 协议就按照 Web 方式来处理;
  2. 调用浏览器内核中的对应方法,比如 WebView 中的 loadUrl 方法;
  3. 通过DNS解析获取网址的IP地址,设置 UA 等信息发出第二个GET请求;
  4. 进行HTTP协议会话,客户端发送报头(请求报头);
  5. 进入到web服务器上的 Web Server,如 Apache、Tomcat、Node.JS 等服务器;
  6. 进入部署好的后端应用,如 PHP、Java、JavaScript、Python 等,找到对应的请求处理;
  7. 处理结束回馈报头,此处如果浏览器访问过,缓存上有对应资源,会与服务器最后修改时间对比,一致则返回304;
  8. 浏览器开始下载html文档(响应报头,状态码200),同时使用缓存;
  9. 文档树建立,根据标记请求所需指定MIME类型的文件(比如css、js),同时设置了cookie;
  10. 页面开始渲染DOM,JS根据DOM API操作DOM,执行事件绑定等,页面显示完成