JavaScript中的数据都是有型别的,共有八种型别:
let n = 123;
n = 12.345;
number类型包含整数和小数,数字类型可以有很多操作,加减乘除等等。
除了一般的常规数字之外,也包含了特殊数值(special numeric value) --- Infinity,-Infinity和NaN。
我们可以透过除0得到
alert( 1 / 0 ); // Infinity
或是直接在代码中使用:
alert( Infinity ); // Infinity
alert( "some string" / 2 ); // NaN
对NaN进行任何操作都会返回NaN的。
在JavaScript中继算是相对安全的,例如除以0或是将非数字字串视为数字等,都不会因此报错,最坏的结果就是得到一个NaN。
在JavaScript中,number类型无法表示大於2的53次方减一(即9007199254740991)或是小於-(2的53次方减一)的整数,在大多数情况这其实已经足够,但如果必要时需要这个区间以外的整数时,可以将n附加在数字後面取得BigInt类型的值。
// 尾部的"n"表示这是一个BigInt类型
const bigInt = 1234567890123456789012345678901234567890n;
字串必须包含在引号内:
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
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
相较於其他语言,JavaScript中的null并不是对不存在的object的引用,JavaScript仅代表“无”“空”“未知”的特殊值。
和null一样自成类型,undefined的含义是为被赋值,如果一个变数被声明,但是并未赋值,那他就是undefined。
let age;
console.log(age); // undefined
从技术上来讲,可以将undefined赋值给一个变数:
let age = 100;
// 主动将值改为 undefined
age = undefined;
alert(age); // "undefined"
但不建议这麽做,通常会将null赋值给变数,而undefined则保留作为变数初始的默任值。
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
我们可以透过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]);
所有的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内容较多,明天再补充
参考资料:
<<: Day01: 01 - 前置准备: 版面设计、安装、开启专案
这个旅程走了 2/3 了,还有 1/3(抱头) MAC 环境下安装 Nessus 先到 Nessu...
html的form标签之input小记录 前言本篇是上课中所提及好用,但是笔者小新手之前未发现的上课...
网格机器人改成一周开启一次就好,到周五机器人会自动关闭 ...
一、前言 上一篇文章介绍了 VSCode 好用的快捷键,此篇开始介绍其他扩充之实用功能罗。没意外...
安装前 要执行的动作 昨天有讲到安装後的执行动作,那安装之前要执行的动作勒?! ex 我想先侦测出本...