变量使用前都要申明,虽然不申明也会默认变为全局变量,但是这样做法是不对的,会造成很多误会.所以每个变量使用前都最后申明,要注意变量申明的提升带来的一些问题.
typeof 操作符
因为js里面的数据类型是松散的,所以需要typeof去鉴别数据类型,一共有6种结果
- 'underfined' 属于未定义
- 'boolean'属于布尔值
- 'string'是字符串
- 'number'是数值
- 'object'是对象
- 'function'是函数
underfined
一般来说,申明一个变量然后不赋值就是underfined,如果申明都没啥申明的打印出来就会报错,例如is not defined,和underfined还是有区别的
注意:即便未初始化的变量会自动被赋予 undefined 值,但显式地初始化变量依然是明智的选择。如果能做到这一点,那么当typeof操作符返回underfined值时就知道变量还没有被申明
null
typeof对null会返回"object"类型,这可以说是历史上的一个失误,但是null表示一个空指针对象,似乎为'object'类型也是说的通的
undefined == null是成立的
Boolean
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符 | '空字符串' |
Number | 任何非0(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Underfined | 无 | underfined |
number
NaN,任何数值除以非数值会返回NaN,任何涉及NaN
- 任何涉及NaN的操作都会返回NaN
- NaN不得能与任何值,包括它本身
0除以0才会等于NaN,判断是否是NaN可以用isNaN函数
数值转换多数用parseInt,在阿里的代码规范里面规定,用parseInt最好都填上第二个参数,第二个参数填的是要转换的数值的基数(就是使用多少进制转换).一般填入10.
Object类型
Object的每个实例都具有下列属性和方法
- constructor 保存用于创建当前对象的函数,对于前面的例子而言,构造函数就是Object()
- hasOwnProperty(属性名称)用于检查当前对象实例中是否有该属性,不会检查原型上的属性,属性名称必须是字符串
- isPrototypeOf(obj)用于检查传入的对象是否是当前对象的原型
- propertyIsEnumerable(属性名称)检查该属性是否能使用for-in来枚举,属性名也是要字符串类型
- toLocaleString()返回对象的字符串表示
- toString()返回对象的字符串表示
- valueOf()返回对象的字符串,数值或布尔值表示,通常与toString()方法的返回值相同
操作符
区分--num和num--的区别
--num是先减再赋值,num--是赋值再--
let num = 1;
let num2 = 1;
let num3 = 1;
let num4 = 1;
console.log(num-- + 1); // 2
console.log(num2--); //1
console.log(--num3 + 1);//1
console.log(--num4);//0
操作符
- !!两个感叹号可以模拟boolean()的作用转化成布尔值
关系操作符有几个要注意的">"."<",">=","<="
- 如果两个都是数值比较数值
- 如果是字符串,比较两个字符串对呀的字符编码
*两个字符串相比较就会把字符串转换成对应的字符编码,会出现以下情况
console.log("23" < '3'); //true
console.log("B" < "a"); //true
console.log("b" < "a"); //false
- 如果有一边是布尔值,会转换成数值进行比较
- 如果有一边是数值,就会把另一边转换为数值
这里就有个注意点,如果转换不成正常的数值就会转换成NaN,任何和NaN比较都将会返回false.
console.log('abc' >= 1); //false
console.log(1 >= 'abc'); //false
函数
- 函数规定传入的参数和实际传入的参数并不一定要相同,并且可以通过arguments拿到传入的参数,arguments还有个length知道一共传入了多少个参数
function fn(a, b) {
console.log(a); // 1
console.log(b); // 2
console.log(arguments[0]); //1
console.log(arguments[1]); //2
console.log(arguments[2]); //3
console.log(arguments.length); //3
}
fn(1, 2, 3)
"还有一个有趣的现象是arguments的值和传入的值保持一致"
例如
function fn(a, b) {
arguments[1] = 1;
console.log(a + b); //2
console.log(b); //1
}
fn(1, 2)
但是如果参数没有传入,然后用arguments去改变并不会奏效,没有传入的参数还是undefined的,严格模式中不能使用
例如:
function fn(a, b) {
arguments[1] = 1;
console.log(a + b); //NaN
console.log(b); //undefined
}
fn(1)
网友评论