你不知道的javaScript笔记(3)
对象
对象可以通过两种形式定义: 声明形式和构造形式
声明形式语法: var myObj = {key:value}
构造形式语法: var myObj = new Object(); myObj.key = value;
类型: 语言类型有六种 : string number boolean null undefined object
内置对象: String Number Boolean Object Function Array Date RegExp Error
var myObject = {
a:2
}
myObject.a; //2 属性访问
myObject["a"] // 2 键访问
ES6 可计算属性名
var prefix = "foo";
var myObject = {
[prefix + "bar"] : "hello",
[prefix + "baz"]: "world"
};
myObject["foobar"]; // hello
myObject["foobaz"]; // world
1.writable 决定是否可以修改属性的值
var myObject = {};
Object.defineProperty(myObject,"a",{
value:2,
writable:false, // 不可写!
configurable: true,
enumerable: true
});
myObject.a = 3;
myObject.a; // 2
2.configurable
只要属性是可配置的,就可以使用defineProperty(..) 方法来修改描述属性。
var myObject = {
a : 2
};
myObject.a = 3;
myObject.a; // 3
Object.defineProperty(myObject,"a",{
value: 4,
writable:true,
configurable:false,// 不可配置
enumerable: ture
});
myObject.a; // 4
myObject.a = 5;
myObject.a; // 5
Object.defineProperty(myObject,"a",{
value: 6,
writable:true,
configurable:true,
enumerable: ture
}) // TypeError
configurable 修改成flash 是单向的,无法撤销
delete只用来删除对象的可删除属性。
var myObject = {
a:2
};
myObject.a //2
delete myObject.a;
myObject.a // undefined
3.enumerable 控制的是属性是否出现在对象的属性枚举中。
1.对象常量,结合writable: false 和configurable: false 就可以创建一个真正的常量属性
(不可修改,重定义或者删除)。
var myObject = {};
Object.defineProperty(myObject,"FAVORITE_NUMBER",{
value:42,
writable: false,
configurable: false
})
2.禁止扩展
禁止一个对象添加新属性并保留已有属性,可以使用Object.preventExtensions(...)
var myObject = {
a:2
};
Object.preventExtensions(myObject);
myObject.b = 3;
myObject.a; // undefined
3.封存
Object.seal(...) 会创建一个 “封存的对象”,这个方法实际上会在一个现有对象上调用
Object.preventExtensions(...) 并把所有属性标记为configurable:false.
4.冻结
Object.freeze(...) 会创建一个冻结对象,这个方法实际上是会在一个现有对象上调用
Object.seal(...) ,还可以深度冻结一个对象。
Getter和Setter
var myObject = {
// 给 a 定义一个getter
get a() {
return 2;
}
}
myObject.a = 3;
myObject.a; // 2
由于只定义了 a 的getter,所以对a 的值进行设置时set 操作会忽略赋值操作,不会抛出错误。
通常来讲getter 和setter是成对出现的
var myObject = {
// 给 a 定义一个getter
get a() {
return this._a_;
},
// 给 a 定义一个setter
set a(val) {
this._a_ = val * 2;
}
};
myObject.a = 2;
myObject.a; // 2
存在性
可以在不访问属性的情况下判断对象中是否存在这个属性:
var myObject = {
a:2
};
("a" in myObject); // true
("b" in myObject); // false
myObject.hasOWnProper("a"); // true
myObject.hasOwnProperty("b"); // false
in 操作符会检查属性是否在对象及[[Prototype]]原型链中。
hasOwnProperty(...) 只会检查属性是否在myObject对象中。
判断属性是否可枚举:
var myObject = {};
Object.defineProperty(
myObject,
"a",
// 让a像普通属性一样可枚举
{enumerable: true,value:2}
);
Object.defineProperty(
myObject,
"b",
// 让b 不可枚举
{enumerable: false,value:3}
)
myObject.propertyIsEnumberable("a"); // true
myObject.propertyIsEnumber("b"); // false
Object.keys(myObject); // ["a"]
Object.getOwnPropertyName(myObject); // ["a","b"]
propertyIsEnumerable(...) 会检查给定的属性名是否直接存在于对象中(而不是在原型链)并且满足enumerable:true
Object.keys(...) 会返回一个数组,包含所有可枚举属性
Object.getOwnPropertyNames(...) 返回一个数组,包含所有属性,无论是否可枚举
遍历
for .. in 可以用来遍历对象的可枚举属性列表
对于数值索引的数组来说,可以使用标准的for 循环
ES5 中新增的 forEach(..) every(...) some(..)
forEach(...) 会遍历数组中所有值并忽略回调函数的的返回值。
every(...) 会一直运行到回调函数返回false
some(...) 会一直运行到回调函数返回true
Es6 增加 for .. of 循环语法
var myArray = [ 1,2,3];
for(var v of myArray){
console.log(v)
}
普通的对象没有@@iterator,可以给任何想遍历的对象自定义
var myObject = {
a:2,
b:3
};
Object.defineProperty(myObject,Symbol.iterator,{
enumerable: false,
writable: false,
configurable: true,
value: function() {
var o = this;
var idx = 0;
var ks = Object.keys(o);
return {
next: function(){
value: o[ks[idx++]],
done:(idx > ks.length)
}
}
}
})
// 手动遍历myObject
var it = myObject[Symbol.iterator]();
it.next(); // {value:2,done: false}
it.next(); // {value:3,done: false}
it.next(); // {undefined,done: true}
// 用 for..of 遍历myObject
for(var v of myObject){
console.log(v)
} // 2 // 3
你不知道的javaScript笔记(3)的更多相关文章
- 你不知道的JavaScript笔记----对象
对象: 1.定义对象属性 属性描述符(也称为:数据描述符) Object.defineProperty(Object,PropertyName,{ value: 6, writable: true, ...
- 你不知道的javaScript笔记(7)
异步:现在与将来 分块的程序 可以把JavaScript 程序写在单独的js 文件中,这个程序是由多个块组成的,这些块 中只有一个是现在执行,其余在捡来执行,最常见的块单位是函数. 例如: funct ...
- 你不知道的javaScript笔记(6)
语法 语句表达式 句子是完整表达某个意思的一组词,由一个或多个短语组成,他们之间由标点符号或者连接词连接起来. 语句相当于句子,表达式相当于短语,运算符则相当于标点符号和连接词. JavaScript ...
- 你不知道的javaScript笔记(5)
原生函数 常用的原生函数 String() Number() Boolean() Array() Object() Function() RegExp() Date() Error() Symbol( ...
- 你不知道的javaScript笔记(4)
类型: JavaScript 有7种内置类型 空值 (null) 未定义(undefined) 布尔值(boolean) 数字(number) 字符串(string) 对象(object) 符号(sy ...
- 你不知道的javaScript笔记(2)
this和对象原型 this是一个很特别的关键字,被自动定义在所有函数的作用域中 // foo.count 是0,字面理解是错误的 function foo(num) { console.log(&q ...
- 你不知道的javaScript笔记(1)
规避冲突 function foo(){ function bar(a){ i = 3; console.log(a + i); } for ( var i=0; i < 10; i++){ b ...
- 你不知道的Javascript(上卷)读书笔记之一 ---- 作用域
你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此 ...
- 你不知道的JavaScript上卷笔记
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...
随机推荐
- 利用ajax短轮询+php与服务器交互制作简易即时聊天网站
主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server-sent Events). 本文主要介绍ajax短轮询的简易实现方式. 看懂此文 ...
- IO流之流的操作规律
流的操作规律 IO流中对象很多,解决问题(处理设备上的数据时)到底该用哪个对象呢? 把IO流进行了规律的总结(四个明确): l 明确一:要操作的数据是数据源还是数据目的. 源:InputStream ...
- Scrum之初体验
一.前言 入职两个月,作为新人,没有参加过一次早晨的scrum会议. 最大的感触就是,有一天中午,带我的开发哥哥突然说产品今天下午提测,我突然就懵了. 这算是我体会的最大的团队中人没有参加scrum, ...
- 什么时候修改class
点击按钮class发生改变 <html> <head> <meta http-equiv="Content-Type" content="t ...
- checkbox中把选项文字与小圆圈关联上
跳舞 唱歌 阅读 睡觉 <form><input id="1" type="checkbox" name="hobbies" ...
- 关于scheduleAtFixedRate方法与scheduleWithFixedDelay的使用
一.scheduleAtFixedRate方法 该方法是ScheduledExecutorService中的方法,用来实现周期性执行给定的任务,public ScheduledFuture<?& ...
- Azure 10月新公布
Azure 10月新发布:F 系列计算优化实例,认知服务,媒体服务流式处理单元更名,Azure 镜像市场,FreeBSD 适用于Azure 虚拟机的全新 F 系列计算优化实例 Azure 虚拟机的全新 ...
- Flask入门邮件同步与异步发送(九)
应用场景: 用户在注册或者密码丢失等过程中,账号绑定邮箱,用户在进行身份认证的过程中,电子邮箱确实是一种很常用的方式,Python中提供了smtplib可以实现发送电子邮件功能,Flask框架也有 ...
- python下的selenium安装
安装python 打开 Python官网,找到“Download”, 在其下拉菜单中选择自己的平台(Windows/Mac),一般的Linux平台已经自带的Python,所以不需要安装,通过打开“终端 ...
- 3.GlusterFS 企业分布式存储的搭建
3.1 硬件要求 一般选择 2U 机型,磁盘 SATA 盘 4TB,如果 IO 要求比较高,可以采购 SSD 固态硬盘.为了充分保证系统的稳定性和性能,要求所有 glusterfs 服务器硬件配置尽量 ...