你不知道的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
- 在一个.net sln中包含多个project,project引用同一个dll导致的错误
- Windows下安装MariaDB
- Quartz.net官方开发指南 第一课:使用Quartz.net
- Quartz.net官方开发指南 第二课:Jobs And Triggers
- 为你的WordPress 主题添加结构化数据/丰富文本摘要,高亮搜索结果(上)
- 复合事件处理(Complex Event Processing)介绍
- Quartz.net官方开发指南 第三课:更多关于Jobs和JobDetails
- 为你的WordPress 主题添加结构化数据/丰富文本摘要,高亮搜索结果(下)
- Quartz.net官方开发指南 第四课:关于Triggers更多内容
- 数据分析:寻找Python最优计算性能
- 事件流处理框架NEsper for .NET
- Quartz.net官方开发指南 第五课: SimpleTrigger
- SQL Server Performance Dashboard Reports
- 添加WordPress评论输入邮箱实时显示Gravatar头像功能
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode题目38:外观数列
- GPUManager虚拟化方案
- [网络安全] 二.Web渗透信息收集之域名、端口、服务、指纹、旁站、CDN和敏感信息
- 程序员进阶系列:你真的懂 HelloWorld 吗?
- 零基础Python教程040期 序列分片技术
- JS实现图片弹窗效果
- [网络安全] 一.Web渗透入门基础与安全术语普及
- 多线程系列(二)之Thread类
- 多线程系列(三)之线程池
- 13 个 JavaScript 数组精简技巧
- 增强型的 <input type=number>
- Python-sqlite3-08-往数据库中写入Excel中信息
- 键盘敲入 A 字母时,操作系统期间发生了什么...
- 类与对象」NSObject对象的分类
- 如何取SQL结果集的第一条记录