1、调用typeof null返回的是Object,这是因为特殊值null被认为是一个对空对象的引用。
2、在对为初始化的变量调用typeof时,返回的结果是undefined,但对未声明的变量调用它时,返回的结果还是undefined:
1 | let message //声明message变量 |
无论是声明还是未声明,typeof返回的字符串都是undefined,因为虽然严格意义上这两个变量存在根本性差异,但是它们都无法执行实际操作。
3、undefined值是由null值派生出来的,因此ECMA-262将它们定义为表面上相等。
1 | console.log(undefined == null) //输出:true |
任何时候,只要变量保存对象,而当时又没有那个对象可保存,就要用null来填充变量。
4、ECMAScript中科学计数法的格式要求是一个数值(整数或浮点数)后跟一个大写或小写字母e,再加上一个要乘的10的几次幂。
5、要测定一个值是不是有无限大,可以使用isFinite()函数:
1 | let result = Number.MMAX_VALUE |
6、任何涉及NaN的操作始终返回NaN,NaN不等于包括NaN在内的任何值。
7、把一个值传给isNaN()后,该函数会尝试把它转换为数值,某些非数值的值可以直接转换为数值。任何不能转换为数值的值都会导致这个函数返回true。
1 | console.log(isNaN(NaN)) //true |
8、parseInt()函数更专注于字符串是否包含数值模式。字符串最前面的空格会被忽略,从第一个非空字符开始转换,如果第一个字符不是数值字符、加号或者减号,parseInt函数会立即返回NaN。这意味着空字符也会返回NaN(这一点跟Number()不一样,它返回0)。如果第一个字符是数值字符,则继续依次检测每个字符,知道字符串末尾,或碰到非数字字符。
9、parseFloat()函数的工作方式跟parseInt()函数类似,都是从位置0开始检测每个字符,解析到字符串末尾或者解析到一个无效的浮点数值字符为止,这也意味着第一次出现的小数点是有效的,但第二次出现的小数点就无效了。
10、parseFloat()函数只解析十进制值,所以不能指定底数。
11、ECMAScript中的字符串是不可变的,意思是一旦创建,他们的值就不变了。要修改某个变量中的字符串值,必须先销毁原始的字符串,然后将包含新值的另一个字符串保存到该变量。如:
1 | let lang = "Java" |
整个过程首先会分配一个足够容纳10个字符串的空间,然后填充上”Java”和”Script”,最后销毁原始的字符串”Java”和字符串”Script”,因为两个字符串都没有用了。
12、字符串值也有toString()方法,该方法只是简单的返回自身的一个副本,null和undefined值没有toString()方法
13、如果你不确定一个值是不是null或者undefined,可以使用String()转型函数,它始终返回表示响应类型值的字符串。String()函数遵循以下规则:
- 如果值有
toString()方法,则调用该方法并返回结果。 - 如果值是null,则返回”null”
- 如果值是undefined,则返回”undefined”
14、用加号操作符给一个值加上空字符""也可以将其转换为字符串。
15、模板字面量中所有插入的值都会使用toString()强制转型为字符串,而且任何JavaSciript表达式都可用于插值。嵌套的字符串无需转义
16、标签函数
模板字面量也支持标签函数,而通过标签函数可以自定义插值行为。标签函数会接收插值记号分隔后的模板和对每个表达式求值的结果。
标签函数本身是一个常规函数,通过前缀到模板字面量来应用自定义行为。
标签函数接收到的参数依次是原始字符串数组和对每个表达式求值的结果,这个函数的返回值是对模板字面量求值得到的字符串。
1 | let a = 6 |
因为表达式参数的数量时可变的,所以通常使用剩余操作符将它们手机到一个数组中。对于有n个插值的模板字面量,传给标签函数的表达式参数个数始终是n,而传给标签函数的第一个参数所包含的字符串始终是n+1。
另外,也可以通过标签函数的第一个字符串参数,即字符串数组的.raw属性去的每个字符串的原始内容。
17、Symbol类型
因为符号本身是原始类型,所以typeof操作符对符号返回symbol。
调用symbol()函数时,也可以传入一个字符串参数作为对符号的描述,将来可以通过这个字符串来调试代码,但是这个字符串参数与符号定义或表示完全无关。symbol()函数不能与new关键字一起作为构造函数使用,这样做是为了避免创建符号包装对象。
18、typeof操作符
typeof 操作符在用于检测函数时也会返回”function”。当在 Safari(直到 Safari 5) 和 Chrome(直到 Chrome 7)中用于检测正则表达式时,由于实现细节的原因,typeof 也会返回”function”。在 IE 和 Firefox 中,typeof 对正则表达式 返回”object”。
19、执行上下文与作用域
每个上下文都有一个关联的变量对象,而这个上下文中定义的所有变量和函数都存在这个对象上。虽然无法通过代码访问变量对象,但后台处理数据会用到它。
上下文在其所有代码都执行完毕后会被销毁,包括定义在它上面的所有变量和函数(全局上下文在应用程序退出前才会被销毁,比如关闭网页或浏览器)。每个函数调用都有自己的上下文,当代码执行流进入到函数时,函数的上下文被推到一个上下文栈中。在函数执行完之后,上下文栈会弹出该函数上下文,将控制权返回给之前的执行上下文。
上下文中的代码在执行的时候,会创建变量对象的一个作用域链。这个作用域链决定了各级上下文中代码的访问变量和函数时的顺序。代码正在执行的上下文的变量对象始终位于作用域链的最前端。如果上下文是函数,则其活动对象用作变量对象。活动对象最初只有一个定义变量:arguments(全局上下文中没有这个变量)。作用域链中的下一个变量对象来自包含上下文,再下一个对象来自再下一个包含上下文。以此类推直至全局上下文;全局上下文的变量对象始终 是作用域链的最后一个变量对象。