你不知道的javascript 笔记(中)
-
内置类型
null
、undefined
、String
、number
、boolean
、object
、symbol
符号typeof null === 'object'
- 函数
function
是object
一个子类,是一个可调用对象,它有一个内部属性[[call]]使其可以调用- 函数对象的length属性是其声明的参数的个数
typeof [] === 'object'
typeof
运算符总是返回一个字符串- undefined和undeclared区别
typeof undeclared
同样返回undefined- 通过typeof安全防范机制(阻止报错)来检查undeclared变量
-
数组
- 类数组转真数组
- Array.prototype.slice.call(arguments)
- Array.from()
- 类数组转真数组
-
字符串
- 字符串也是类数组
- 字符串不可变
- 字符串借用数组的非变更方法
Array.prototype.join.call(str,"-")
Array.pototype.map.call(str,function(){})
-
数字
- 小数点前面的0可以省略,小数点后面的0也可以省略
tofixed()
指定小数部分的显示位置toPrecision()
指定有效数位的显示位数- 整数检测
Number.isInteget()
-
特殊数值
-
null指曾赋过值,但是目前没有
-
undefined值从未赋值
-
NAN
isNaN()
判断一个值是否是NaN
-
无穷数 —
Infinity
-
零
-
特殊等式
-
Object.is()
能使用和=就不要使用Object.is(),因为前者效率更高,更为通过。后者主要用来处理那些特殊的相等比较
-
-
-
值和引用
- 简单值总是用过值复制的方式来赋值
- 复合值总是通过引用复制的方式来赋值
-
封装对象
- 自动封装字面量的字符串和数字
- 拆封
valueOf
-
创建包含undefined单元的数组
Array.apply(null,{length:3})
-
Symbol字符
- 不用new关键字
-
原生原型
- Array.prototype
- String.prototype
-
字符串拼接
- 如果对象有自己的toString()方法,字符串化时就会调用该方法并使用其返回值。
- 数组的默认的toString()经过重新定义,将所有单元字符串化后再用","连接起来。
-
JSON.stringify()
- 遇到undefine、function、symbol时自动将其忽略,在数组中则返回null。
- 可以传递有一个可选参数,可以用来指定对象序列化过程中哪些属性应该处理。
- 还可以写一个可选参数space,用来指定输出的缩进格式。
- 字符串、数字、布尔值和null的JSON.stringify()和toString基本相同
- 如果对象定义了toJSON方法,该方法会在字符串化前调用。
-
toNumber
-
true
转换为1,false
转换为0,undefined
为NaN,null
为0 -
valueOf和toString均不返回基本类性质,会产生TypeError错误
-
-
假值对象
var a = new Boolean(false) var b = new Number(0) var c = new String("") // 上面结果都为true
-
+ +
和- -
能够将字符创相加或者取绝对值var c = "3.14" var d = 5 + + c //8.14 var e = - -“3.14” //3.14
-
使用Date.now()来过去当前的时间戳,使用new Date(…).getTime()获取指定时间的时间戳
-
+号字符串拼接
-
如果+的其中一个操作数是字符串,则执行字符串拼接,否则执行数字加法
-
如果a是数字,隐式转换先调用a的valueOf()方法,然后通过toString抽象操作将返回值转换为字符串
-
如果是a是对象,则不一样
var a = { valueOf:function(){return 42} toString:function(){return 4} a + "" //42 String(a) //4 }
-
-
布尔值强制类型转换
function onlyOne(){ var sum = 0 for(var i = 0;i<arguments.length;i++){ sum += Number(!!arguments[i]) //!! } return sum === 1 }
-
隐式强制类型转换为布尔值
- if
- for第二个表达式
- while
- ?:
- || &&
- || 如果条件判断第一个操作数结果为true就返回第一个操作数的值,如果为false就返回第二个操作数的值
- && 如果条件判断第一个操作数为true就返回第二个操作数的值,如果为false就返回第一个操作数的值
-
== 与 ===区别
- 允许在相等比较中进行强制类型转换,而=不允许
-
异步
-
事件循环伪代码
var eventloop = [] var event whilr(true){ if(eventloop.length > 0){ event = eventloop.shift() try{ event() }catch(err){ reportError(err) } } }
-
定时器只能确保你的回调函数不会在指定时间间隔之前运行。
-
异步不等同于并行
-