本文介绍: JS有 七 种 内 置 类 型:nullundefinedbooleannumberstringobjectsymbol可以使用 typeof 运算符查看变量没有类型,但它们持有的值有类型。类型定义了值的行为特征。很 多 开 发 人 员 将 undefined 和 undeclared 混 为 一 谈, 但 在JS中 它 们 是 两 码 事。undefined 是值的一种。undeclared表示变量还没有声明过。

1、类型

我们这样来定义类型:类型是值的内部特征,它定义了值的行为,以使其区别于其他值

1.1、内置类型

JS有其中内置类型:nullundefinedbooleannumberstringobjectsymbol(ES6新增),除了对象之外,其余统称为基本类型”

可以使用typeof运算符查看值的类型,但是null一个例外

typeof null === "object" // true

函数对象中,length属性是其声明参数个数数组也是对象,是object一个子类型”

function a(b,c){
	...
}
a.length // 2

1.2、值和类型

JS中的变量是没有类型的,只有值才有。变量可以随时持有任何类型的值

typeof运算符总是会返回个字符

已在作用域声明但还没有赋值的变量,是undefined。相反,还没有作用域中声明过的变量,是undeclared

var a ;
a // undefined
b // ReferenceError: b is not defined

对于这类情况的处理让人抓狂,如果对于b可以返回undeclared的话,情况会好很多

1.3、总结

JS有 七 种 内 置 类 型:nullundefinedboolean、numberstringobjectsymbol可以使用 typeof 运算符查看

变量没有类型,但它们持有的值有类型。类型定义了值的行为特征

很 多 开 发 人 员 将 undefined 和 undeclared 混 为 一 谈, 但 在JS中 它 们 是 两 码 事。undefined 是值的一种。undeclared 则表示变量还没有被声明过。遗憾的是,JavaScript 却将它们混为一谈,在我们试图访问 “undeclared” 变量时这样报错:ReferenceError: a is not defined, 并 且 typeof 对 undefined 和 undeclared 变 量 都 返 回”undefined“。

然而,通过 typeof 的安全防范机制(阻止报错)来检查 undeclared 变量,有时是个不错的办法。

2、值

2.1、数组

在JS中,数组可以容纳任何类型的值,可以字符串数组、对象,甚至是其他数组

使用delete运算符可以将单元数组删除,但是删除后,数组的length属性并不会发生变化

var a = [ ];
a[0] = 1;
a["foobar"] = 2;
a.length; // 1
a["foobar"]; // 2
a.foobar; // 2

数组通过数字进行索引,但是有趣的是他们也是对象,所以他们也可以包含字符串键值属性

2.2、类数组

可以使用数组工具函数indexOf(…)、concat(…)、forEach(…))将类数组转换位真正的数组,也可以使用Array.from()

const arrayLike = { 0: 'a', 1: 'b', 2: 'c', length: 3 };
const arr = Array.from(arrayLike);
console.log(arr); // ['a', 'b', 'c']

const arrayLike = { 0: 'a', 1: 'b', 2: 'c', length: 3 };
const arr = Array.prototype.slice.call(arrayLike);
console.log(arr); // ['a', 'b', 'c']

2.3、字符串

字符串与数组类似,,他们都是类数组,都有length属性以及indexOf(…)和concat(…)方法,但是在JS中字符串是不可变的,而数组是可变的,在进行字符反转时,我们可以如下来做:

var c = a
	.split("") // 将a的值转换字符数组
	.reverse() // 将数组中的字符进行倒转
	.join("") // 将字符串中的字符拼接回字符串

2.4、数字

JS只有一种数值类型,包括“整数”和带小数十进制

JS中的数字类型是基于IEEE754标准实现的,该标准通常也被称为浮点数”,JS使用的是“双精度格式(64位二进制

特别大和特别小的数字默认用指数格式显示,与toExponential()函数用于将数字转换为指数形式的字符串)的输出结果一致

const num = 123.456789;
console.log(num.toExponential()); // 输出:1.23456789e+2
console.log(num.toExponential(2)); // 输出:1.23e+2
console.log(num.toExponential(6)); // 输出:1.234568e+2

tofixed(…)方法指定小数部分显示位数

var a = 42.59;
a.toFixed( 0 ); // "43"
a.toFixed( 1 ); // "42.6"
a.toFixed( 2 ); // "42.59"
a.toFixed( 3 ); // "42.590"
a.toFixed( 4 ); // "42.5900"

toPrecision(…) 方法用来指定有效数位显示位数

var a = 42.59;
a.toPrecision( 1 ); // "4e+1"
a.toPrecision( 2 ); // "43"
a.toPrecision( 3 ); // "42.6"
a.toPrecision( 4 ); // "42.59"
a.toPrecision( 5 ); // "42.590"
a.toPrecision( 6 ); // "42.5900"

上边的方法不仅适用于数字变量,也适用于数字字面量。不过对于.运算符需要给予特别注意,因为它是一个有效数字字符,会被优先识别为数字字面量的一部分然后才是对象属性访问运算

// 无效语法
42.toFixed( 3 ); // SyntaxError
// 下面的语法都有效:
(42).toFixed( 3 ); // "42.000"
0.42.toFixed( 3 ); // "0.420"
42..toFixed( 3 ); // "42.000"

在JS中0.1+0.2!=0.3,因为他是浮点数,我们可以设置一个误差范围值,该值定义在Number.EPSILON中,可以使用它来比较两个数字是否相等

function numbersCloseEnoughToEqual(n1,n2) {
	return Math.abs( n1 - n2 ) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
numbersCloseEnoughToEqual( a, b ); // true
numbersCloseEnoughToEqual( 0.0000001, 0.0000002 ); // false

如果要检测一个是否整数,可以使用ES6中的Number.isInteger(…)方法

Number.isInteger( 42 ); // true
Number.isInteger( 42.000 ); // true
Number.isInteger( 42.3 ); // false

2.5、特殊的值

null一个特殊关键字,不是标识符,不能将其当做变量来使用,尽管 null 可以被赋值给变量,但它本身并不是变量,也不应该被当做变量来使用。当我们需要表示一个空的对象引用时,才将 null 赋值给变量,并使用该变量来表达空值概念

undefined一个标识符,可以被当做变量来使用和赋值

void运算符,void___ 没有返回值,因此返回结果是undefined,void并不改变表达式结果,只是让表达式返回值,如果要将代码中的值设为undefined,就可以使用void

var a = 42;
console.log( void a, a ); // undefined 42

2.6、特殊的数字

NaN意指“不是一个数字”,是一个特殊值,它和自身不相等,是唯一一个非自反的值,因此无法对其进行比较,那么应该如何判断它,可以使用isNaN,该方法意思是“参数是否不是NaN,也不是数字”

var a = 2 / "foo";
isNaN( a ); // true

我们也可以使用下边的方法

var a = 2 / 'foo';
var b = 'foo';
console.log(Number.isNaN(a)); // true
console.log(Number.isNaN(b)); // false

无穷数Infinity

在JS中var a = 1 / 0 结果为Infinity,如果该式中一个数为负数,结果即为-Infinity

JS中,零值分为+0和-0,为什么我们需要-0,因为某些程序中的数据需要级数形式来表示(比如动画帧的移动速度

在ES6中,新加入了一个工具方法Object.is(…)来判断两个是否相等,但是能使用“”和“=”的时候就尽量不要使Object.is(…),因为前者的效率更高也更为通用

2.7、值和引用

在许多语言中,复制参数传递可以通过复制或者引用复制完成引用就像一种特殊指针,是来指向变量的指针,但是在JS中没有指针,引用的工作机制也不尽相同。在JS中变量不可成为指向另一个变量的引用。JS引用指向的是值。如果一个值有10个引用,这些引用指向的都是同一个值,它们之间没有引用/指向关系

简单值(基本类型值)总是通过复制方式来赋值/传递,包括null、undefined、字符串、数组、布尔和ES6中的symbol复合值—对象和函数,则总是通过引用复制方式来赋值/传递

引用指向的是值本身而非变量,所以一个引用无法更改另一个引用的指向

function foo(x) {
	x.push( 4 );
	x; // [1,2,3,4]
	// 然后
	x = [4,5,6];
	x.push( 7 );
	x; // [4,5,6,7]
}
var a = [1,2,3];
foo( a );
a; // 是[1,2,3,4],不是[4,5,6,7]

我们不能通过引用 x 来更改引用 a 的指向,只能更改 a 和 x 共同指向的值。

如果要将a的值变为[4,5,6,7],必须更改x指向的数组,而不是为x赋值一个新数组

function foo(x) {
	x.push( 4 );
	x; // [1,2,3,4]
	// 然后
	x.length = 0; // 清空数组
	x.push( 4, 5, 6, 7 );
	x; // [4,5,6,7]
}
var a = [1,2,3];
foo( a );
a; // 是[4,5,6,7],不是[1,2,3,4]

我们无法自行决定使用值复制还是引用复制,一切由值的类型来决定。

3、总结

JS中的数组是通过数字索引一组任意类型的值。字符串和数组类似,但是它们的行为特征不同,在将字符作为数组来处理需要特别小心。JavaScript 中的数字包括“整数”和“浮点型”。

基本类型中定义了几个特殊的值。null 类型只有一个值 null,undefined 类型也只有一个值 undefined。所有变量在赋值之前默认值都是 undefined。void 运算返回 undefined。

数 字 类 型 有 几 个 特 殊 值, 包 括 NaN( 意 指“not a number”, 更 确 切 地 说 是“invalidnumber”)、+Infinity、-Infinity 和 -0。

简单标量基本类型值(字符串和数字等)通过值复制来赋值 / 传递,而复合值(对象等)通过引用复制来赋值 / 传递。JavaScript 中的引用和其他语言中的引用 / 指针不同,它们不能指向别的变量 / 引用,只能指向值。

原文地址:https://blog.csdn.net/qq_60754128/article/details/134723297

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_43548.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注