Javascript权威指南之类型、变量和表达式

整型直接量

在ES6的严格模式下,八进制是被严格禁止的。
在之前的版本虽然不支持,但是javascript的某些实现使得可以使用八进制数作为整型数。

算术运算

Number.POSITIVE_INFINITY === Infinity;  //tue
Number.NEGATIVE_INFINITY === -Infinity;  //tue
isFinite()Infinity-InfinityNaN的时候返回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
""        //空字符串

null和undefined

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在直接调用时,它总是在的上下文作用域内执行。间接调用(通过别名调用)时,它在全局作用域下执行,并且无法读写、定义局部变量和函数。
在严格模式下,eval执行的代码段可以查询和更改局部变量,但不能再局部作用域定义新的变量或者函数。

你可能感兴趣的:(JavaScript)