类型
首先贴下ECMA定义的类型
基本数据类型:
- Number(数字)
- String(字符串)
- Boolean(布尔)
- Symbol(符号)(第六版新增)
- Null(空)
- Undefined(未定义)
先上代码1
2
3
4
5
6
7
8var should = require('should');
var user = {
name: 'tj',
pets: ['tobi', 'loki', 'jane', 'bandit']
};
user.should.have.property('name', 'tj'); // true
看到这样的写法是不是很酷炫,反正我当时就是,我们来一步一步实现它。
首先user这个对象本身是没有should这个属性的,那就肯定是往原型链上找了,所以事先把这个属性挂载到Object.prototype上
1 | // 1、 |
看看效果1
2
3
4
5
6
7
8
9
const tool = require('./lib/defind');
const user = {
a: 1,
b: 'test'
};
console.log(user.tool); // 3、
ECMAScript 将对象的属性分为数据属性和访问器属性,属性描述符有两种主要形式:数据描述符和存取描述符,
使用defineProperty可以为对象已有的属性添加特性描述:1
2
3
4
5
6
7
8
9
10var obj = {
test:"hello"
}
//对象已有的属性添加特性描述
Object.defineProperty(obj,"test",{
configurable:true | false, // 是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)
enumerable:true | false, // 是否可枚举
value:任意类型的值,
writable:true | false // 属性的值是否可以被重写
});
var 定义的变量允许变量提升(Hoisting),还涉及到 变量进行 LHS(Left Hand Side)查找1
2
3举个栗子:
console.log(x); // undefined
var x = 'var is up';
但是得注意一下,var声明的变量可以提升,但是如果是一个定义一个函数,函数表达式是不可以提升的,如下:1
2
3
4
5
6
7
8
9
10var x = func();
var func = function(){
return 'this is function';
}
// 相当于下面的代码:
var func;
var x = func();
func = function(){
return 'this is function';
}