Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【Javascript基础】数据类型 #1

Open
Sukiey opened this issue Jun 27, 2020 · 1 comment
Open

【Javascript基础】数据类型 #1

Sukiey opened this issue Jun 27, 2020 · 1 comment

Comments

@Sukiey
Copy link
Owner

Sukiey commented Jun 27, 2020

原始值类型

ECMScript 标准定义了 6 种原始值类型,分别是 布尔值(Boolean)、字符串(String)、数值(Number)、Null、Undefined 和 Symbol(ES6 新引入的)。

  • 原始值类型亦称为 '原始数据类型' 或 '基本数据类型'。
  • 原始值类型的值是 按值访问 的。
  • 它指的是那些保存在 内存中的简单数据。

什么是原始值

  • 原始值只是一种字面量;
  • javascript 引擎会自动把字面量转换成对象,所以可以访问属性和方法。比如:"test".length

原始值类型有哪些

1. boolean

布尔类型。有两个字面量:truefalse。ECMScript 中所有类型都有与这两个布尔值等价的值。

  • true等价的值:非0数字,非空字符串,Object
  • false等价的值:0, 空字符串 "", undefined, null, NaN
// 代码示例
console.log(Boolean(1) === true))
console.log(Boolean("test string") === true)
console.log(Boolean({}) === true)  // true

console.log(Boolean(0) === false)
console.log(Boolean(NaN) === false)
console.log(Boolean("") === false)
console.log(Boolean(undefined) === false)
console.log(Boolean(null) === false) // true

2. string

字符串类型。

区分基本字符串和字符串对象

通常我们定义的都是基本字符串,却可以调用字符串对象才有的属性方法,那是因为 Javascript 引擎会自动将基本字符串转换为字符串对象并且调用相应的方法。

  • 基本字符串
    • 通过引号定义 或者 直接调用String()方法生成的字符串都是基本字符串
  • 字符串对象
    • 通过new String()生成字符串对象实例

长字符串

  • 可以使用+运算符拼接多个字符串
  • 可以在每行末尾使用反斜杠字符\,以指示字符串将在下一行继续,注意反斜杠后面只能紧跟换行符,负责反斜杠将不起作用。
// 代码示例
let test1 = "string";
console.log(test1.length); // 6
console.log("cat".charAt(1)); // "a"

let longString1 =
  "This is a very long string which needs \
to wrap across multiple lines because \
otherwise my code is unreadable.";
let longString2 =
  "This is a very long string which needs " +
  "to wrap across multiple lines because " +
  "otherwise my code is unreadable.";
console.log(longString1 === longString2); // true

3. number

数值类型,包括了整数和浮点数。由于内存限制,ECMScript 并不能保存世界上所有的数值。

数值范围

  • 最大值:Number.MIN_VALUE = 5e-324
  • 最大值:Number.MAX_VALUE = 1.7976931348623157e+308
  • 无穷大:Infinity
  • 无穷小:-Infinity

NaN

代表非数值,是 Not a Number 的简写。

  • undefined 和任何数值计算结果都为 NaN
  • NaN 与任何值都不相等,包括 NaN 本身
  • isNaN() 可以用来判断某个变量或者表达式结果是否为非数值
// 代码示例
let test1 = 10;
let test2 = 10.23;

console.log("abc" / 18); // NaN
console.log(NaN === NaN); // false
console.log(isNaN(NaN)); // true
console.log(isNaN("blue")); // true
console.log(isNaN("123")); // false, 存在隐式转换
console.log(isNaN(123)); // false

console.log(typeof NaN === "number"); // true

4. null

null 代表的是一个空值。null 是被赋值出来的

  • null 转为数值时为0, 所以 null 与任何数值运算,可以看作 0 运算
// 代码示例
console.log(10 + null); // 10
console.log(typeof null === "object"); // 这是JS的一个bug

5. undefined

一个没有被赋值的变量的类型是 undefined,通常表示一个变量被声明了,但是没有被初始化。

  • void 0 可以用来替代 undefined
  • undefined 和任何数值计算结果都为 NaN
  • undefined 和 null 很相似,但还是有差别的

典型用法:

  1. 变量被声明了,但没有赋值时,就等于 undefined。
  2. 调用函数时,应该提供的参数没有提供,该参数等于 undefined。
  3. 对象没有赋值的属性,该属性的值为 undefined。
  4. 函数没有返回值时,默认返回 undefined。
// 代码示例
let test1; // undefiend
console.log(10 + undefined); // NaN
console.log(typeof undefined === "undefined"); // true

console.log(null == undefined); // true
console.log(null === undefined); // false,

console.log(void 0 === undefined); // true

注意: 严格比较运算符(===)和比较运算符(==)之间的差别。前者会比较操作数的类型和值,后者会将操作数的类型转换成相同的类型之后做值比较

6. symbol

ECMAScript 6 新定义

let test1 = Symbol("foo");
test1.description; // "foo"
@Sukiey
Copy link
Owner Author

Sukiey commented Jun 27, 2020

引用类型

除了 6 种原始值类型之外,其余的都是引用类型,统称为 对象类型。

  • 引用类型的值是按引用访问的。
  • 引用类型的值是保存在内存中的复杂数据。

更多关于 ECMScript 规范内容

按引用访问

  • 引用类型的数据在内存中的存储方式与原始值类型的数据不同,它的值被保存在堆内存中,而栈内存中存储的是指向堆内存的存储位置(指针)。
  • 在访问引用类型数据时,拿到的其实是指向真实数据的指针。

创建对象的两种方式

  1. 字面量,是对象定义的一种简写形式
  2. 构造函数

引用类型有哪些

ECMScript 规范中定义了很多内置的对象,细分的话包括:

  • Object
  • Function,
  • String, Boolean, Number
  • Array, Map, Set
  • Date, RegExp, Math, Error, JSON, Promise 等等

更多内置对象

Object 类型

Object 是一个特殊的对象,它本身是一个顶级对象(在原型链的顶端),同时还是一个构造函数,可以通过它(new Object())来创建一个对象。

Function 类型

每个 JavaScript 函数实际上都是一个 Function 对象。运行 (function(){}).constructor === Function // true 便可以得到这个结论。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant