标识符
命名规则:第一个字符,可以是任意 Unicode 字母(包括英文字母和其他语言的字母),以及美元符号($)和下划线(_)。
第二个字符及后面的字符,除了 Unicode 字母、美元符号和下划线,还可以用数字0-9。
注释
除了单行注释和多行注释外,js还可以兼容html的代码注释
x = 1; <!-- x = 2;
--> x = 3;
//结果只有x=1会执行;
需要注意的是,–>只有在行首才会被当成单行注释,否则会被当成正常运算。
switch
需要注意的是,switch语句后面的表达式,与case语句后面的表示式比较运行结果时,采用的是严格相等运算符(===),而不是相等运算符(==),这意味着比较时不会发生类型转换。
var x = 1;
switch (x) {
case true:
console.log('x 发生类型转换');
break;
default:
console.log('x 没有发生类型转换');
}
// x 没有发生类型转换
标签(label)
- 跳出特定循环:
top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) break top;
console.log('i=' + i + ', j=' + j);
}
}
如果不用标签,break只能跳出内层循环,用了标签可以跳出外层循环。
continue 同理。
- 跳出代码块:
foo: {
console.log(1);
break foo;
console.log('本行不会输出');
}
console.log(2);
数据类型
- 基本数据类型(值类型)
- number
在js内部,所有数都是以64位浮点数形式储存的,即使整数也是如此。
1===1.0 //true
JavaScript 提供Number对象的MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。
NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合,一些数学函数的运算结果会出现,0除以0也会得到NaN,它数据类型仍属于Number
5 - 'x' // NaN
Math.acos(2) // NaN
Math.log(-1) // NaN
Math.sqrt(-1) // NaN
0 / 0 // NaN
typeof NaN // 'number'
NaN === NaN // false 不等于任何值 包括它本身
Boolean(NaN) // false 布尔当作false
NaN + 32 // NaN 与任何数的运算得到的都是NaN
Infinity 无穷 有正负
//特殊用法
0 * Infinity // NaN
Infinity - Infinity // NaN
Infinity / Infinity // NaN
null * Infinity // NaN
Infinity / null // Infinity
//与undefined计算返回的都是0
与数值有关的全局方法:
- parseInt() 将字符串转为整数
如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN
- parseFloat()方法用于将一个字符串转为浮点数
- isNaN 判断一个值是否为NaN
isNaN只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成NaN,所以最后返回true,这一点要特别引起注意。也就是说,isNaN为true的值,有可能不是NaN,而是一个字符串。
isNaN(NaN) // true
isNaN(123) // false
isNaN('Hello') // true
出于同样的原因,对于对象和数组,isNaN也返回true。对于空数组和只有一个数值成员的数组,isNaN返回false(被Number函数转成数值)。
判断NaN更可靠的方法是,利用NaN为唯一不等于自身的值的这个特点,进行判断。
function myIsNaN(value) {
return value !== value;
}
-
isFinite方法返回一个布尔值,表示某个值是否为正常的数值。
除了Infinity、-Infinity、NaN和undefined这几个值会返回false,isFinite对于其他的数值都会返回true。 -
string
字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)。
如果方括号中的数字超过字符串的长度,或者方括号中根本不是数字,则返回undefined。
实际上,无法改变字符串之中的单个字符。
使用Unicode字符集,所有字符在内部都以Unicode存储。
每个字符在 JavaScript 内部都是以16位(即2个字节)的 UTF-16 格式储存。 -
boolean
-
undefined和null
语法效果几乎等价,都表示没有undefined == null // true
区别:null是一个表示“空”的对象,转为数值时为0;undefined是一个表示"此处无定义"的原始值,转为数值时为NaN。
//null可以自动转化成0
Number(null) // 0
5 + null // 5
//undefined转化成NaN
Number(undefined) // NaN
5 + undefined // NaN
布尔值:
undefined、null、false、0、NaN、""或’’(空字符串)会转化成false,其他都为true
注意,空数组([])和空对象({})对应的布尔值,都是true。
- object
- symbol(es6)
类似于标识符
- 引用数据类型:
Object
Array
Function
运算符
有三种方法可以确定一个值到底是什么类型
- typeof 运算符
可以返回一个值的数据类型
//基本类型返回
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
//函数返回
function f() {}
typeof f
// "function"
//undefined返回
typeof undefined
// "undefined"
//利用这一点,可以用来检查一个没有声明的变量而不报错。
v
// ReferenceError: v is not defined
typeof v
// "undefined"
//运用
// 错误的写法
if (v) {
// ...
}
// ReferenceError: v is not defined
// 正确的写法
if (typeof v === "undefined") {
// ...
}
空数组([])的类型也是object,这表示在 JavaScript 内部,数组本质上只是一种特殊的对象。instanceof运算符可以区分数组和对象。
null 返回object
- instanceof 运算符
- Object.prototype.toString 方法
返回一个表示对象类型的字符串
对象
查看一个对象本身的所有属性
var obj = {
key1: 1,
key2: 2
};
Object.keys(obj);
// ['key1', 'key2']
delete命令用于删除对象的属性,删除成功后返回true。
delete obj.p // true
delete命令只能删除对象本身的属性,无法删除继承的属性
所以就算delete返回true ,仍有可能读到值
in运算符用于检查是否包含某个属性
var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true
它不能识别哪些属性是对象自身的,哪些属性是继承的。要用hasOwnProperty判断一下是否为自身属性
var obj = {};
if ('toString' in obj) {
console.log(obj.hasOwnProperty('toString')) // false
}
for…in循环用来遍历一个对象的全部属性。(只会遍历可遍历的)
with:它的作用是操作同一个对象的多个属性时,提供一些书写的方便。(建议不要使用,绑定对象无法判断是全局对象还是obj的一个属性)
var obj = {
p1: 1,
p2: 2,
};
with (obj) {
p1 = 4;
p2 = 5;
}
// 等同于
obj.p1 = 4;
obj.p2 = 5;