33-js-concepts(二)原始类型

2023-11-04

原始类型

原始类型

2.1

基本类型(基本数值、基本数据类型)是一种既非对象也无方法的数据。在 JavaScript 中,共有7种基本类型:string,number,bigint,boolean,null,undefined,symbol (ECMAScript 2016新增)。
所有基本类型的值都是不可改变的。但需要注意的是,基本类型本身和一个赋值为基本类型的变量的区别。变量会被赋予一个新值,而原值不能像数组、对象以及函数那样被改变。
基本类型值可以被替换,但不能被改变。

// 使用字符串方法不会改变一个字符串
var bar = "baz";
console.log(bar);               // baz
bar.toUpperCase();
console.log(bar);               // baz

// 使用数组方法可以改变一个数组
var foo = [];
console.log(foo);               // []
foo.push("plugh");
console.log(foo);               // ["plugh"]

// 赋值行为可以给基本类型一个新值,而不是改变它
bar = bar.toUpperCase();       // BAZ
// 基本类型
let foo = 5;
// 定义一个貌似可以改变基本类型值的函数
function addTwo(num) {
   num += 2;
}
// 和前面的函数一样
function addTwo_v2(foo) {
   foo += 2;
}
// 调用第一个函数,并传入基本类型值作为参数
addTwo(foo);
console.log(foo);   // 5
// 尝试调用第二个函数...
addTwo_v2(foo);
console.log(foo);   // 5

请看看代码是如何运行的:

  • addTwoaddTwo_v2函数调用时,JavaScript会检查标识符foo的值,从而准确无误的找到第一行实例化变量的声明语句。
  • 找到以后,JavaScript将其作为参数传递给函数的形参。
  • 在执行函数体内语句之前,JavaScript会将传递进来的参数(基本类型的值)复制一份,创建一个本地副本。 这个副本只存在于该函数的作用域中,我们能够通过指定在函数中的标识符访问到它(addTwo中的numaddTwo_v2中的foo)。
  • 接下来,函数体中的语句开始执行: 第一个函数中,创建了本地num参数,num的值加2,但这个值并不是原来的foo的值。
    第二个函数中,创建了本地参数foo,并将它的值加2,这个值不是外部foo的值。在这种情况下,外部的foo变量不能以任何方式被访问到。这是因为JavaScript的词法作用域(lexical
    scoping)所导致的变量覆盖,本地的变量foo覆盖了外部的变量foo。欲知详情,请参阅闭包。
  • 综上所述,函数中的任何操作都不会影响到最初的foo,我们操作的只不过是它的副本。

除了 null 和 undefined之外,所有基本类型都有其对应的包装对象。包裹对象的valueOf()方法返回基本类型值。

2.2

对变量或值调用 typeof 运算符将返回下列值之一:object - 如果变量是一种引用类型或 Null 类型的。
除 typeof 之外的其他运算符只能用于已声明的变量上。
undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。
所有数学运算返回的都是十进制结果。对于非常大或非常小的数,可以用科学计数法表示浮点数,可以把一个数表示为数字(包括十进制数字)加 e(或 E),后面加乘以 10 的倍数。var fNum = 5.618e7
当计算生成的数大于 Number.MAX_VALUE 时,它将被赋予值 Number.POSITIVE_INFINITY,意味着不再有数字值。同样,生成的数值小于 Number.MIN_VALUE 的计算也会被赋予值 Number.NEGATIVE_INFINITY,也意味着不再有数字值。如果计算返回的是无穷大值,那么生成的结果不能再用于其他计算。

事实上,有专门的值表示无穷大,(如你猜到的)即 InfinityNumber.POSITIVE_INFINITY 的值为 InfinityNumber.NEGATIVE_INFINITY 的值为 -InfinityisFinite() 方法,以确保该数不是无穷大。
特殊值 NaN,表示非数(Not a Number)

2.3

考虑分数1 / 10。在十进制,它被写作0.1。在二进制中,它是:0.00011001100110011……假设我们仅保留5位尾数,可以写为0.0001。但0.0001在二进制表示法中实际是1 / 16(或0.0625)的表示!这意味着有舍入误差为0.0375,这是相当大的。想象一下基本的加法运算,如0.1 + 0.2,答案返回0.2625
浮点规范指定ECMAScript最多使用52个尾数,所以舍入误差变得很小——规范的具体细节规避了大部分的舍入误差。
JavaScript中的数字是真正的浮点数。由于二进制表示的固有缺陷,以及有限的机器空间,我们不得不面对一个充满舍入误差的规范。处理浮点数最好的建议是使用库.

2.4

在这里插入图片描述

2.5

JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。
符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度。
指数部分一共有11个二进制位,因此大小范围就是0到2047。JavaScript 提供的有效数字最长为53个二进制位。精度最多只能到53个二进制位,这意味着,绝对值小于2的53次方的整数,即-253到253,都可以精确表示。64位浮点数的指数部分的值最大为2047,分出一半表示负数,则 JavaScript 能够表示的数值范围为2^1024到2^-1023(开区间),超出这个范围的数无法表示。

(-1)^符号位 * 1.xx...xx * 2^指数部分

上面公式是正常情况下(指数部分在0到2047之间),一个数在 JavaScript 内部实际的表示形式。

2.6

typeof new String("hippo") + "potamus"; //"objectpotamus"
typeof true; //"boolean"
typeof Boolean(true); //"boolean"
typeof new Boolean(true); //"object"
typeof (new Boolean(true)).valueOf(); //"boolean"
 
typeof "abc"; //"string"
typeof String("abc"); //"string"
typeof new String("abc"); //"object"
typeof (new String("abc")).valueOf(); //"string"
 
typeof 123; //"number"
typeof Number(123); //"number"
typeof new Number(123); //"object"
typeof (new Number(123)).valueOf(); //"number"
var primitive = "september";
primitive.vowels = 3;
//new object created to set property 
(new String("september")).vowels = 3;
 
primitive.vowels;
//another new object created to retrieve property 
(new String("september")).vowels; //undefined
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

33-js-concepts(二)原始类型 的相关文章

  • AI大模型及算力要求

    AI大模型对算力的要求非常高 需要高性能的硬件设备和分布式训练技术来支持 随着AI技术的不断发展 未来可能会出现更大 更复杂的模型 对算力的要求也将更高 今天和大家分享几个大模型及算力要求 希望对大家有所帮助 北京木奇移动技术有限公司 专业
  • markdown公式编号居右

随机推荐