JavaScript

JavaScript中的数据类型、值和变量

JS类型

原始类型

数字 字符串 布尔值 null undefined

对象类型

Object
(这些都是Object的子类)Function Array Date Math
RegExp Number String Boolean

NaN Infinity

Js中运算上溢和下溢(计算结果无限接近于0,但比JS能表示的最小值还小时发生的一种情景)都不报错会得到无穷大Infinity和0。负数下溢得到-0.
0/0 结果为NaN 4/0 为Infinity
判断是不是NaN x!=x 若为true则x为NaN 或者用isNaN(x) Infinity和
-Infinity不是NaN

布尔值

null undefined 0 -0 NaN ''" " "(空字符串和只有空格的字符串) 以上都会被转换为false。(但是""和" "的长度是不一样的)" "==false; //为true " ".length=1
其他所有值,空数组,空对象等都会被转换为true
严格相等运算符 === 不进行类型转换 必须要类型和值都相等才为true
null == undefined //true
null === undefined //false
!!null 隐式类型转换

包装对象

数字 字符串 布尔值 的包装对象分别为Number String Boolean
存取字符串、数字或布尔值的属性时创建的临时对象称为包装对象,临时对象在使用完之后会马上销毁。当下次再存取字符串等的属性时又会重新新建一个临时对象。
包装对象可以显示的创建
var s=new String('xxx');

原始值和对象引用

原始值是不能改变的,字符串是返回的新的字符串,原字符串是没改变的。
对象的值是可以修改的。
两个单独的对象或数组永不相等

var a=[]; b=[];
a==b ; //false 
a===b; //false
a=b;
a===b//true   对象数组的比较其实是引用变量的比较,当两个引用变量都指向同一个数组或对象时则相等

变量声明

var x; //声明一个变量但是没初始化
var a=1;//初始化变量
给未声明的变量直接赋值,在严格模式下报错,在非严格模式下,会给全局对象创建一个同名的属性。
b=1;
window.b //1

作用域

全局作用域和函数作用域 (ES6中有块级作用域)
在函数内声明的变量只在函数内有定义,在局部作用域里局部变量会覆盖重名的全局变量。

函数作用域的声明提前

在函数作用域内声明的所有变量在函数体内都是可见的。这意味着变量在声明之前就已经可用了

function f(){
console.log(a);   //输出undefined
var a=1;
}

虽然声明会提前,但是变量的赋值还是在原赋值语句处。