https://yanhaijing.com/basejs/
1.表达式产生值,语句通常“做某些事情”
2.原始类型和对象区别
(1)每一个对象有一个独一无二的标志,并且仅和自己相等
var obj1 = {}; // 一个空对象
var obj2 = {}; // 另一个空对象
obj1 === obj2;//false
(2) 原始类型值的属性无法更改,无法添加和移除属性。
var str = 'abc';
str.foo = 3; // try to create property `foo` ? no effect
str.foo // unknown property
3.undefined和null
#######undefined没有值
1)未初始化的
var foo;
foo;// undefined
2)读取不存在的属性
var obj = {}; // 空对象
obj.foo;//undefined
3)缺省的参数
function f(x) { return x }
########null没有对象
4.“包装对象”,就是分别与数值、字符串、布尔值相对应的Number、String、Boolean三个原生对象。
var v1 = new Number(123);
var v2 = new String('abc');
var v3 = new Boolean(true);
typeof v1 // "object"
typeof v2 // "object"
typeof v3 // "object"
Number、String和Boolean如果不作为构造函数调用(即调用时不加new),常常用于将任意类型的值转为数值、字符串和布尔值。
Number(123) // 123
String('abc') // "abc"
Boolean(true) // true
三种包装对象各自提供了许多实例方法。两种它们共同具有、从Object对象继承的方法:valueOf和toString
var str = 'abc';
str.length // 3
abc是一个字符串,本身不是对象,不能调用length属性。JavaScript 引擎自动将其转为包装对象,在这个对象上调用length属性。调用结束后,这个临时对象就会被销毁。这就叫原始类型与实例对象的自动转换。
等同于:
var strObj = new String(str)
// String {
// 0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"
// }
strObj.length // 3
5.typeof 和 instanceof
typeof 主要用于原始值,instanceof 主要用于对象
type操作数 结果
undefined 'undefined'
null 'object' null的类型是“object”。这是一个bug,但从没被修复,因为修复后会破坏现有的代码
Boolean value 'boolean'
Number value 'number'
String value 'string'
Function 'function'函数的类型是“function”而不是“object”。鉴于函数(类型为“function”)是对象(类型是对象)的子类型,这不是一个错误。
All other values 'object'
> var b = new Bar(); // 通过构造函数Bar创建对象
> b instanceof Bar //true
> {} instanceof Object // true
> [] instanceof Array //true
> [] instanceof Object // 数字是对象的子类型true
6.以下被理解成false
undefined, null
布尔: false
数字: -0, NaN
字符串: ‘’
7.二元逻辑运算符(短路运算——如果第一个操作数可以确定结果,第二个操作数将不被验证)
false && foo() //foo()永远不会被调用
true || foo() //foo()永远不会被调用
二元逻辑运算符结果不一定是true/false:
NaN && 'abc' // NaN
123 && 'abc' //'abc'
'abc' || 123 //'abc'
'' || 123 //123
8.JavaScript中的数字是真正的浮点数。
由于二进制表示的固有缺陷,以及有限的机器空间,我们不得不面对一个充满舍入误差的规范。
1 === 1.0 // true
9.字符串方法slice、trim、toUpperCase、indexOf
> 'abc'.slice(1) // 复制子字符串
'bc'
> 'abc'.slice(1, 2)
'b'
> 'abc'.indexOf('b') // 查找字符串
1
> 'abc'.indexOf('x')
-1
10.在严格模式下,this指向undefined;在非严格模式下,this的值是被称作全局对象(global object)(在浏览器里是window)
11.IIFE:模拟块级作用域
有时你想模拟一个块,例如你想将变量从全局作用域隔离。完成这个工作的模式叫做 IIFE
(function () { // 块开始
var tmp = ...; // 非全局变量
}()); // 块结束
外面的括号用来阻止它被解析成函数声明;只有函数表达式能被立即调用。函数体产生一个新的作用域并使 tmp 变为局部变量
12.闭包
每个函数保持和函数体内部变量的连接,甚至离开创建它的作用域之后。例如:
function createIncrementor(start) {
return function () { // (*)
return start++;
}
}
var inc = createIncrementor(5);
inc();//5
inc();//6
inc();//7
13.检验属性是否在某一对象中
法1:'newProperty' in jane
法2:jane.newProperty !== undefined 读取不存在的属性的会得到undefined值
用delete删除属性
14.如果你引用一个方法,它将失去和对象的连接。解决办法是使用函数内置的bind()方法。它创建一个新函数,其this值固定为给定的值。
var jane = {
name: 'Jane',
describe: function () {
'use strict';
return 'Person named '+this.name;}
};
var func = jane.describe;
func();//TypeError: Cannot read property 'name' of undefined
var func2=jane.describe.bind(jane);
func2();//'Person named Jane'
15.in操作符可以作用在数组也可以作用在对象上
var arr = [ 'a', 'b', 'c' ];
'a' in arr;//true
16.正则表达式
1)test()
> /^a+b+$/.test('aaab')
true
2)exec()匹配和捕获组,返回的数组第一项(索引为0)是完整匹配,捕获的第一个分组在第二项(索引为1)
> /a(b+)a/.exec('_abbba_aba_')
[ 'abbba', 'bbb' ]
3)replace()搜索并替换
> '<a> <bbb>'.replace(/<(.*?)>/g, '[$1]')
'[a] [bbb]'