JavaScript学习日记 : Day4 - 基本型别(二)

1. Object

相对於其他数据类型,object在JavaScript中用来储存键值对(Key-Value Pair),或是用来储存更复杂的实体。

1.1 物件新增方法

Object宣告的方法有两种:

  • Object Literal(物件实字):

可以通过括号来创建,括号内的属性列表是可选的,一个属性就是一个键值对(key : value),其中键(key)是字符串,值(value)可以是任何值。

let a = {...}
  • Object Constructor(物件建构式) :

用new关键字加上Object()来宣告一个物件。

let b = new Objetc()

1.2 物件属性(Object properties)

Object中新增property有两种方法:

  • . --- 点号运算子
  • [] --- 括号运算子
let myObj = new Object();
let str = 'myString';
let randNum = Math.random();
let obj = new Object();

myObj.type = 'Dot syntax';
myObj['date created'] = 'String with space';
myObj[str] = 'String value';
myObj[randNum] = 'Random Number';
myObj[obj] = 'Object';
myObj[''] = 'Even an empty string'

console.log(myObj)

//
type: "Dot syntax"
myString: "String value"
date created: "String with space"
[object Object]: "Object"
0.4381989149265799: "Random Number"
"": "Even an empty string"

属性的简写:

function makeCar(type, color) {
    return {
        type, // 等於 type : type
        color // 等於 color : color
    }
}

1.3 属性名称限制

变数不能是保留字,例如: for、let、return等,但是属性名称是没有限制的。

let obj = {
    for:123,
    let:456,
    return:789
}

其他类型也会自动被转换为字串:

let obj = {
    0:"test" // 等同於 "0":"test"
}

console.log(obj[0]) // test

这里有个例外,__proto__这个属性是不能被设定为属性的,在後面的文章会提到。

1.4 属性存在的判断

Object还有一个特别的地方就是去读取不存在的属性不会报错,只会回传undefined,所以可以很简单的做一个属性存在的判断:

let user = {}

console.log(user.id) //undefined

但是如果属性的值刚好是undefined的话,上面这个方法就不行,改用另一个检查方法是操作符"in":

let user = {
    id:1,
    name:'John',
    age:20
}

console.log('name' in user); // true
console.log('height' in user); // false

"in"操作符的左边必须是属姓名,通常是字串,如果省略引号的话就视为变数:

let user = {
    id:1,
    name:'John',
    age:20
}

let key = "age"

console.log(key in user)

1.5 for..in循环

这个方法可以遍历object的属性。

语法:

for(key in object) {
    //这边可以针对key这个属性作一些操作
}

举一个简单的例子:

let user = {
    id:1,
    name:'John',
    age:20
}

for(let key in user) {
    console.log(key)
}

所有遍历的属性是有规则的:

  • 优先显示非负整数属性,整数属性由小到大。
  • 整数属性以外类别的则按照新增的顺序。

举个例子会比较快明白:

let classmates = {
    "10":"David",
    "9":"Tina",
    //...
    "1":"John"
}

for(let studentId in classmates) {
    console.log(studentId) // 1 9 10
}

非负整数属性: 如果一个字符串把它转换为整数後再转换为数字,如果与原本一样,就是整数属性。

console.log(String(Math.trunc(Number("10")))) //10 相同,整数属性
console.log(String(Math.trunc(Number("+10")))) //10 不同
console.log(String(Math.trunc(Number("10.5")))) //10 不同 
console.log(String(Math.trunc(Number("-10")))) //-10 不同 归类为其他类别 

一样用一个简单的例子:

let classmates = {
    "10":"David",
    "+9":"somebody"
    "9":"Tina",
    //...
    "1":"John",
    "0":"Teacher"
    "-1":"NegativeNum"
    "otherType":"otherTypeValue"
}

for(let key in classmates) {
    console.log(key)
}

//
0
1
9
10
+9
-1
otherType

结论

  1. 物件的新增方法有两种:
  • Object Literal(物件实字)
  • Object Constructor(物件建构式)
  1. 物件属性新增方法有两种:
  • . --- 点号运算子
  • [] --- 括号运算子
  1. 属性名称是没有限制的,除了__proto__这个属性比较特别。
  2. "in"操作符可以判断属性是否存在,for..in则可以遍历这些属性。

参考资料:

Object
JavaScript Info
JavaScript | 关於 Object ,一口气全说完
JavaScript Object (物件)


<<:  [Day 01] 什麽是云端运算?

>>:  C# 入门 SSH 连接

Day 12 - 阵列 b

简介 上一篇介绍了一维阵列的用法还有如何宣告,今天就来介绍二维阵列 还有一些我们在写 code 时需...

[读书笔记] Threading in C# - PART 1: GETTING STARTED

本篇同步发文在个人Blog: [读书笔记] Threading in C# - PART 1: GE...

程序中出现问号(?)跟冒号(:),这是什麽表达方式?

笔者最近在维护前人弃坑的C# 专案的程序码看到?跟:,这是啥东西? 一开始以为是lambda 在C#...

Day 19. 来找找Unreal Engine有没有VR Simulation

安装Unreal的过程意外频出啊,差点以为我的电脑出事了,结果是因为我time machine开着,...

[DAY5] 病识感──当我们关注到测试

能载舟,能覆舟 前几篇似乎说了很多 Rails 的坏话,但其实 Rails 是一套工具,工具没有好坏...