JavaScript学习日记 : Day3 - 基本型别(一)

1. 型别总览

JavaScript中的数据都是有型别的,共有八种型别:

  • 数字(Number)
  • 字串(String)
  • 布林(Boolean)
  • Undefined
  • Null
  • Symbol
  • Bigint
  • Object

2. 型别介绍

2.1 Number

let n = 123;
n = 12.345;

number类型包含整数和小数,数字类型可以有很多操作,加减乘除等等。

除了一般的常规数字之外,也包含了特殊数值(special numeric value) --- Infinity,-Infinity和NaN。

2.1.1 Infinity代表数学概念中的无穷大。

我们可以透过除0得到

alert( 1 / 0 ); // Infinity

或是直接在代码中使用:

alert( Infinity ); // Infinity

2.1.2 NaN代表计算错误或是一个未定义的数学操作结果。

alert( "some string" / 2 ); // NaN

对NaN进行任何操作都会返回NaN的。

在JavaScript中继算是相对安全的,例如除以0或是将非数字字串视为数字等,都不会因此报错,最坏的结果就是得到一个NaN。

2.2 BigInt

在JavaScript中,number类型无法表示大於2的53次方减一(即9007199254740991)或是小於-(2的53次方减一)的整数,在大多数情况这其实已经足够,但如果必要时需要这个区间以外的整数时,可以将n附加在数字後面取得BigInt类型的值。

// 尾部的"n"表示这是一个BigInt类型
const bigInt = 1234567890123456789012345678901234567890n;

2.3 String

字串必须包含在引号内:

let str = "Hello";
let str2 = 'Single quotes are ok too';
let phrase = `can embed another ${str}`;

单引号跟双引号基本上是没什麽差别的,而反引号允许我们将变数或是表达式包装在引号中的${}:

let name = "David";

// 加入一个变数
alert( `Hello, ${name}!` ); // Hello, David!

// 加入一个表达式
alert( `the result is ${1 + 2}` ); // the result is 3

2.4 Boolean

Boolean只包含True与False。

let nameFieldChecked = true; // yes, name field is checked
let ageFieldChecked = false; // no, age field is not checked

也可以作为比较的结果:

let isGreater = 4 > 1;

console.log( isGreater ); // true

2.5 Null

相较於其他语言,JavaScript中的null并不是对不存在的object的引用,JavaScript仅代表“无”“空”“未知”的特殊值。

2.6 Undefined

和null一样自成类型,undefined的含义是为被赋值,如果一个变数被声明,但是并未赋值,那他就是undefined。

let age;

console.log(age); // undefined

从技术上来讲,可以将undefined赋值给一个变数:

let age = 100;

// 主动将值改为 undefined
age = undefined;

alert(age); // "undefined"

但不建议这麽做,通常会将null赋值给变数,而undefined则保留作为变数初始的默任值。

2.7 Symbol

symbol值表示唯一的识别符号,可以使用Symbol()来创建。

// id 是 symbol一个实例化的对象
let id = Symbol();

创建时也可以给Symbol一个描述(symbol名)

// id 是描述为 "id" 的 Symbol
let id = Symbol("id");

且symbol是保证唯一的:

let id1 = Symbol("id");
let id2 = Symbol("id");

alert(id1 == id2); // false

Symbol不会被自动转换为字串
JavaScript大多都支持字符串的转换,例如我们可以alert任何的值,都可以生效,但是symbol例外。

let id = Symbol("id");
alert(id); // 类型错误:无法将 Symbol 值转换为字串。

这是一种防止混乱的语言保护,因为字符串跟symbol本质上不同,不应该转换成为另一个。如果真的想要显示出一个symbol:

let id = Symbol("id");
alert(id.toString()); // Symbol(id) 

或者获取symbol.description,只显示出描述:

let id = Symbol("id");
alert(id.description); // id

2.7.1 隐藏属性

我们可以透过Symbol创建object的隐藏属性,从外部是无法获取这些属性。

let cart = {
    userName: "John"
}

let id = Symbol("id");

cart[id] = 1;

console.log(cart[id])

使用Symbold("id")与使用字串"id"来新增主要的差别在於,如果cart是第三方的代码,如果我们随意新增属性,是有可能影响到第三方的代码,但是透过Symbol新增的属性,第三方代码中是获取不到的。

另外,Symbol在for...in中是会被忽略的:

let id = Symbol("id")
let cart = {
    userName:"John",
    age:20,
    [id]:1
};

for(let key in cart) {
    console.log(key)
} // name, age

Object.keys()也一样会忽略。但是Object.assign会复制symbol所创建的属性:

let id = Symbol("id");
let person = {
    height:180,
    weight:70,
    [id]:10
}

let clonePerson = Object.assign({}, person);

console.log(clonePerson[id]);

2.7.2 全域的Symbol

所有的Symbol的值都是不同的,即使他们的名称一样,如果说我们想要让有相同名子的Symbol返回相同的值,可以使用Symbol.for

Symbol.for(key)会从一个全域的Symbol注册列表中搜寻有相同名称的Symbol值,如果没有就新增一个,并且放入全域注册列表中。

let id = Symbol.for("id") // 不存在的话,就新增

let idA = Symbol.for("id"); // 获取到id

console.log( id === idA); // true

还有另一个methodSymbol.keyFor是用来反查Symbol的名称。

let idA = Symbol.for("userAId")
let idB = Symbol.for("userBId")

console.log(Symbol.keyFor(idA)) // userAId
console.log(Symbol.keyFor(idB)) // userBId

剩下的Object内容较多,明天再补充/images/emoticon/emoticon34.gif

参考资料:

JavaScript Info
Symbol
BigInt


<<:  Day01: 01 - 前置准备: 版面设计、安装、开启专案

>>:  AE特效烛火-Day14

Day 20 - 装个 Nessus 试试

这个旅程走了 2/3 了,还有 1/3(抱头) MAC 环境下安装 Nessus 先到 Nessu...

笔记:好用HTML5 的表单input元件及属性

html的form标签之input小记录 前言本篇是上课中所提及好用,但是笔者小新手之前未发现的上课...

2022/02/12 更新

网格机器人改成一周开启一次就好,到周五机器人会自动关闭 ...

Day10:程序码编辑器的实用扩充套件(2)

一、前言   上一篇文章介绍了 VSCode 好用的快捷键,此篇开始介绍其他扩充之实用功能罗。没意外...

@Day10 | C# WixToolset + WPF 帅到不行的安装包 [自订动作介接画面-安装前执行]

安装前 要执行的动作 昨天有讲到安装後的执行动作,那安装之前要执行的动作勒?! ex 我想先侦测出本...