在ES6的严格模式下,八进制是被严格禁止的。
在之前的版本虽然不支持,但是javascript的某些实现使得可以使用八进制数作为整型数。
Number.POSITIVE_INFINITY === Infinity; //tue
Number.NEGATIVE_INFINITY === -Infinity; //tue
isFinite()在Infinity、-Infinity、NaN的时候返回true
isNaN()在NaN、非数字类型值的时候返回true
ES6
Number.isNaN()只在NaN的情况返回true
由于二进制无法精确表示0.1等小数,在舍入误差的情况下,或出现不相相等。
0.3 - 0.2 === 0.2 - 0.1; //false
在ES3,字符串必须写在一行;在ES5中,字符串可以拆分成多行写,每行必须以(\)结尾;如果想另起一行,可以使用(\n)进行换行;
"xiao \
ming"
//字符串多行写法
"xiao \n ming"
`xiao
ming`
'xiaoming: I\'m'
字符串属于基本类型值,是固定不变,所有字符串的方法都是返回一个新的字符串,原字符串本身并没有改变。
falsy假值,以下在转换为布尔值,会转成false
undefined
null
NaN
0
-0
"" //空字符串
undefined表示系统级的、出乎意料的或类似错误的值得空缺;
null表示程序级的、正常的或在意料之中的值得空缺。
typeof null === 'object';
//typeof 操作符检测 null 的类型标签位时发现是 000
//000: object - 当前存储的数据指向一个对象
//浏览器 window
//node环境 global
字符串,数字,布尔值等基本类型值和对象一样,拥有方法和属性
null和undefined没有包装对象,访问他们的属性将会报错
let str = 'abcde';
str.substring();
//其实会通过new String(str)转换成对象,进而继承原型上的方法和属性
//一旦对方法或者属性的引用结束,这个包装对象就会马上销毁(大致可以理解成这个一个过程)
包装对象的属性是只读的,不能给其赋值
let s = "test";
s.len = 4;
console.log(s.len); //undefined 临时对象在引用完就被销毁了
字符串虽然可以向数组通过下标获取值,但是给其赋值是无法,基本类型值是不可改变。数字和布尔值就显而易见了。
原始值的复制被拷贝出一个副本,但是对象的复制都是指向同一个基对象。(原始值得比较是比较值本身,而对象的比较是其引用地址)
几个可能需要注意的转换:
undefined => "undefined"(字符串) => NaN(数字)
null => "null"(字符串) => 0(数字)
[]=> ""(字符串) => 0(数字)
['a']=> "a"(字符串) => NaN(数字)
"=="运算符从不试图将其操作数转换为布尔值;
原始值到对象的转换调用各自的构造函数,生成对应的包装对象;
调用Number()、Boolean()、String()、Object()进行转换
1.如果“+”运算符的一个操作数是字符串,则将另外一个操作数转换为字符串;
2.一元“+”运算符则是将操作数转换为数字
3."!"操作符则是将操作数转换为布尔值并取反
Number.toString(n); //n代表转换的进制数
以下的转换规则仅仅适用于本地对象(也就是自己定义的对象)
1.所有对象转换布尔值都为true
2.转换为数字,则是将先调用valueOf(),t如果不存在,则调用toString(),最后再转化为数字,否则,则抛出一个类型异常错误。
3.转换为字符串,则是将先调用toString(),如果不存在,则调用valueOf(),最后再转化为字符串,否则,则抛出一个类型异常错误。
var定义的变量会进行变量提升,在赋值之前访问该变量的话,会返回undefined;
let定义的变量不会进行变量提升,在定义赋值之前访问该变量的话,会抛出引用类型错误;
作用域链是一个对象列表或者链表,这组对象定义了这段代码“作用域中”的变量。
在JavaScript在最顶层的代码中(也就是不包含任何函数定义内的代码),作用域链是由一个全局对象组成。
在不包含嵌套的函数体内,作用域链对象有两层。第一层是定义函数参数和局部变量的对象,第二层是全局对象。
在包含嵌套的函数体内,作用域链有三层。
eval的字符串在执行时的上下文环境和调用函数的上下文环境是一致的。
eval在直接调用时,它总是在的上下文作用域内执行。间接调用(通过别名调用)时,它在全局作用域下执行,并且无法读写、定义局部变量和函数。
在严格模式下,eval执行的代码段可以查询和更改局部变量,但不能再局部作用域定义新的变量或者函数。