走进JavaScript——重拾对象
创建对象
Object构造器的参数如果为空或null、undefined将返回一个空的Object对象,如果为其他值则调用相应的构造器,如
new Object()
// Object {}
new Object(null)
// Object {}
new Object(undefined)
// Object {}
new Object(1)
// Number {[[PrimitiveValue]]: 1}
new Object("a")
// String {0: "a", length: 1, [[PrimitiveValue]]: "a"}
new Object({})
// Object {}
new Object([1,2,3])
// [1, 2, 3]
new Object(function(){})
// function (){}
如果传递多个参数取第一个,由于使用构造器来创建对象需要判断参数所以一般比我们直接使用字面量{}创建对象要慢一些。
我们也可以自己定义一个构造器来创建对象,如下
function CreateObj(){}
var obj = new CreateObj();
obj.a = 10;
// 10
这些方法创建的对象都不是一个真正干净的对象,如果希望创建一个没有原型继承的空对象则可以使用Object.create方法
Object.create(null)
// Object {} No Properties
对象直接量
var obj = {
title: '晴天',
content: '....'
};
key可以以字符串形式来写也可以按标识符来写,一般我们会以标识符来写,当遇到需要使用一些不合法的标识符时我们会以字符串的形式来写,如:
{1:2};
{.l:1};
由于以上对象属性名是不合法的,因此我们需要使用字符串的形式来写。
{'1':2};
{'.l':1};
如果key和value名一样,value值可以不写
var a = 1;
var obj = {a};
console.log(obj);
// Object {a: 1}
如果希望key是一个变量,我们可以这样
var a = 'hello';
console.log({[a]:a});
Object {hello: "hello"}
在一个对象中不能有多个同名属性,如果相同最后一个将覆盖之前的
{
a:123,
a:456
}
// Object {a: 456}
对象不能有多个同名属性的特性,我们可以使用它来实现数组过滤重复项
var arr = [1,3,3,2,1,1],
obj = {};
arr.forEach((item)=>obj[item] = item);
console.log(obj)
// Object {1: 1, 2: 2, 3: 3}
但由于对象的储存并不是按照我们填写的顺序来的,因此对于有顺序要求的我们就不能使用上面的方式来实现了。
对象和数组在某些方面非常相似,因此只需要我们按照数组的格式来写就可以将对象转换成一个数组
Array.from({
'0':'hello',
'1':'world',
'length':2
})
// ["hello", "world"]
遍历对象
for in
var obj = {html:111,javascript:222};
for(let key in obj){
console.log(obj[key]);
}
// 111
// 222
for in会将原型继承中的值也循环出来,因此我们需要过滤一下
// 没过滤之前
Object.prototype.a = '捣乱的';
var obj = {html:111,javascript:222};
for(let key in obj){
console.log(obj[key]);
}
// 111
// 222
// 捣乱的
// 过滤之后
Object.prototype.a = '捣乱的';
var obj = {html:111,javascript:222};
for(let key in obj){
if(obj.hasOwnProperty(key)){
console.log(obj[key]);
}
}
// 111
// 222
我们也可以用for来循环对象,不过我们得先使用Object.keys来取对象的key
Object.prototype.a = '捣乱的';
var obj = {html:111,javascript:222};
var arr = Object.keys(obj);
for(let i = 0; i < arr.length; i++){
console.log(obj[arr[i]]);
}
// 111
// 222
for of
Object.prototype.a = '捣乱的';
var obj = {html:111,javascript:222};
for(let key of Object.keys(obj)){
console.log(obj[key]);
}
// 111
// 222
对象与其他值的运算
和对象、function相加会转换成字符串拼接,如果是其他值则会转换为数字
{} + null
// 0
{} + undefined
// NaN
{} + 'a'
// NaN
{} + '111'
// 111
{} + {}
// "[object Object][object Object]"
{} + [2]
// 2
{} + function(){}
// "[object Object]function (){}"
如果是相减则会将对象转换为-0(注意是-0),如果是对象减对象则是NaN
{} - ''
// -0
{} - []
// -0
{} - null
// -0
{} - undefined
// NaN
{} - {}
// NaN
{} - function(){}
// NaN
{} - 2
// -2
为什么说对象被转换成负0而不是0呢,我们用一个例子来证明
0 - 0
// 0
-0 - 0
// -0
所以说对象被转换成-0而不是0
走进JavaScript——重拾对象的更多相关文章
- 走进javascript——重拾数组
Array构造器 如果参数只有一个并且是Number类型,那么就是指定数组的长度,但不能是NaN,如果是多个会被当做参数列表. new Array(12) // (12) [undefined × 1 ...
- 走进JavaScript——重拾函数
创建函数 通过构造器的方式来创建函数,最后一个参数为函数体其他为形参 new Function('a','b','alert(a)') /* function anonymous(a,b) { ale ...
- 重拾算法之复杂度分析(大O表示法)
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- CSS魔法堂:重拾Border之——不仅仅是圆角
前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...
- CSS魔法堂:重拾Border之——图片作边框
前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...
- javascript中的对象,原型,原型链和面向对象
一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...
- 重拾C
重拾C,一天一点点_10 来博客园今天刚好两年了,两年前开始学编程. 忙碌近两个月,项目昨天上线了,真心不容易,也不敢懈怠,接下来的问题会更多.这两天调试服务器,遇到不少麻烦. 刚出去溜达了一下,晚上 ...
- 【Java】 重拾Java入门
[概论与基本语法] 取这个标题,还是感觉有些大言不惭.之前大三的时候自学过一些基本的java知识,大概到了能独立写一个GUI出来的水平把,不过后来随着有了其他目标,就把这块放下了.之后常年没有用,早就 ...
- 重拾Java Web应用的基础体系结构
目录 一.背景 二.Web应用 2.1 HTML 2.2 HTTP 2.3 URL 2.4 Servlet 2.4.1 编写第一个Servlet程序 2.5 JSP 2.6 容器 2.7 URL映射到 ...
随机推荐
- Java ---Listener监听器
在我们的web容器中,一直不断的触发着各种事件,例如:web应用启动和关闭,request请求到达和结束等.但是这些事件通常对于开发者来说是透明的,我们可以根据这些接口开发符合我们自身需求的功能.在w ...
- Spring+Redis(keyspace notification)实现定时任务(订单过期自动关闭)
1.起因 最近公司项目要做订单超期未支付需自动关闭,首先想到的是用spring的定时器(@Schedule),结果领导举各种例子说会影响性能,只能作罢.后来想能不能基于redis实现, 学习(baid ...
- 文本处理sed常用操作
文本处理sed常用操作 linux sed (stream editor) is a Unix utility that parses and transforms text, using a sim ...
- PHPexcel数据导出
使用PHPexcel数据导出,可以从网上下载phpexcel引入使用,下面是我做的简单的数据导出练习 一.下载phpexcel 二.引发这个导出(我这里是写了一个简单的点击事件) <div id ...
- openssl命令行-证书认证
命令1: openssl genrsa -out root.key 1024 产生一个root.key的私钥 命令2: openssl req -key root.key -new -out ro ...
- CSS元素垂直居中方法总结
坚持,坚持,坚持... 以上为自我鼓励,哈哈... ------------------------------------------------- 相信没有真正是尝试过的人应该都和我一样,觉得居中 ...
- 第一次在gitHub上传项目到git.oschina的方法
首先在Git@osChina创建一个项目仓库 1.创建sshKey公钥 ssh-keygen -t rsa -C "ty635725964@qq.com" 之后连续三个空格,默认无 ...
- 通过bootloader向内核传输启动参数
作者:Younger Liu,本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. Linux提供了一种通过bootloader向其传输启动参数的功能,内核开发者 ...
- Windows7下安装IIS
1.点击开始→控制面板,然后再点击程序,勿点击卸载程序,否则到不了目标系统界面. 2.然后在程序和功能下面,点击打开和关闭windows功能. 3.进入Windows功能窗口,然后看到internet ...
- js中面向对象编程
一.理解对象: 第一种:基于Object对象 var person = new Object(); person.name = 'My Name'; person.age = 18; person.g ...