js 数据类型
js 数据类型
1. 基本数据类型
基本数据类型是按值访问的,也就是说我们可以操作保存在变量中的实际的值,
1.1 undefined
(1)只有一个值,即 undefined,如果声明了一个变量,但是未给变量初始化值,那么这个变量的值就是undefined;
let name = 'Kobe'; let age; console.log(name); // 输出:Kobe console.log(age); // undefined,因为声明了age,但是没有给初始值
(2)调用函数时,应该提供的参数没有提供,该参数等于 undefined;
(3)对象没有赋值的属性,该属性的值为 undefined;
(4)函数没有返回值,默认返回 undefined;
1.2 null
(1)null 类型被看做空对象指针,只有一个值,即 null 值,所以在用 typeof 操作符去检测 null 类型的值的时候,结果是 object 类型;
typeof null; // undefined
(2)如果你定义了一个变量,但是想在以后把这个变量当做一个对象来使用,最好将还变量初始化为 null;
1.3 number
(1)number 类型包含整数和浮点数(浮点数数值必须包含一个小数点,且小数点后至少有一位数字)
浮点数会自动转换成整数,如下:
let num = 1.00; console.log(num); // 输出1
(2)浮点数的最高精度是17位,如下:
let a = 0.1; let b = 0.2; console.log(a + b); // 输出:0.30000000000000004
(3)NaN:非数字类型
特点:涉及到任何关于 NaN 的操作,都会返回 NaN,而且 NaN 不等于自身。如下:
let name = 'lisi'; console.log(name / 10); // 输出:NaN console.loh(NaN === NaN); // 输出:false
(4)isNaN() 函数用于判断是否是一个非数字类型,如果传入的参数是一个非数字类型,那么返回 true,否则返回 false;
(5)isNaN() 函数传入一个参数,函数会先将参数转换为数值,如果参数类型为对象类型,会先调用对象的valueOf() 方法,再确定该方法返回的值是否可以转换为数值类型,如果不能,再调用对象的 toString() 方法,再确定返回值;
(6)数值转化
Number():可用于任何类型数据;
parseInt():将值转换为整型;
parseFloat():将值转换为浮点型;
1.4 Boolean
(1)这个类型只有两个值,true 和 false;
(2)Boolean(),转型函数,将某个值转换为 Boolean 类型;
1.5 string
(1)字符串类型中的单双引号作用一样;
(2)字符串有 length 属性,可以取得字符串的长度;
let str = "hello world"; console.log(str.length); // 输出:11
(3)字符串的值是不可改变的,要改变一个字符串的值,首先要销毁原来的字符串,再用另一个包含新值的字符串去填充该字符串;
(4)字符串转换函数
String(),适用于任何数据类型(null,undefined 转换后为 null 和 undefined)
toString(),方法可以把一个逻辑值转换为字符串,并返回结果(null,undefined 没有toString()方法)
let ab = 'Kobe'; let bc = null; let cd = undefined; console.log(ab.toString()); // 输出:Kobe // console.log(bc.toString()); // error 报错 // console.log(cd.toString()); // error 报错 console.log(String(ab)); // 输出:Kobe console.log(String(bc)); // 输出:null console.log(String(cd)); // 输出:undefined
1.6 Symbol
Symbol 是 ES6 的新增属性,代表用给定名称作为唯一标识,这种类型的值可以这样创建:
let id = symbol("id");
Symbl 确保唯一,即使采用相同的名称,也会产生不同的值。我们创建一个字段,仅为知道对应 symbol 的人能访问,使用 symbol 很有用,symbol 并不是100%隐藏,有内置方法 Object.getOwnPropertySymbols(obj)可以获得所有的 symbol。也有一个方法 Reflect.ownKeys(obj) 返回对象所有的键,包括 symbol。所以并不是真正隐藏。但大多数库内置方法和语法结构遵循通用约定他们是隐藏的。
2. 引用数据类型
当复制保存着对象的某个变量时,操作的是对象的引用,但在为对象添加属性时,操作的是实际的对象。引用类型值指那些可能为多个值构成的对象。
引用类型有这几种:Object、Array、RegExp、Date、Function、特殊的基本包装类型(String、Number、Boolean)以及单体内置对象(Global、Math)。
3. 基本数据类型与引用数据类型的区别
(1)基本数据类型的值是不可变的,任何方法都无法改变一个基本类型的值,当这个变量重新赋值后看起来变量的值是改变了,但是这里变量名只是指向变量的一个指针,所以改变的是指针的指向改变,该变量是不变的。但是引用类型可以改变。
(2)基本数据类型不可以添加属性和方法,但是引用类型可以。
(3)基本数据类型的赋值是简单赋值,如果从一个变量向另一个变量赋值基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上,引用数据类型的赋值是对象引用,
(4)基本数据类型的比较是值的比较,引用类型的比较是引用的比较,比较对象的内存地址是否相同
(5)基本数据类型是存放在栈区的,引用数据类型同时保存在栈区和堆区
4. NaN
NaN 是 JS 中的特殊值,表示非数字。
NaN 不是数字,但是他的数据类型是数字,它不等于任何值,包括自身。
在布尔运算时被当做 false,NaN 与任何数运算得到的结果都是NaN。
运算失败或者运算无法返回正确的数值的就会返回 NaN,一些数学函数的运算结果也会出现NaN 。
5. JS的作用域类型
一般认为的作用域是词法作用域,此外 JS 还提供了一些动态改变作用域的方法,常见的作用域类型有:
函数作用域,如果在函数内部我们给未定义的一个变量赋值,这个变量会转变成为一个全局变量,
块作用域:块作用域把标识符限制在{}中,
改变函数作用域的方法:
eval(),这个方法接受一个字符串作为参数,并将其中的内容视为好像在书写时就存在于程序中这个位置的代码,
with 关键字:通常被当做重复引用同一个对象的多个属性的快捷方式
6. undefined和null
目前 null
和 undefined
基本是同义的,只有一些细微的差别,null
表示没有对象,undefined
表示缺少值,就是此处应该有一个值但是还没有定义。
undefined==null
返回 true。
6.1 为什么 null == undifined
要比较相等性之前,不能将 null
和 undefined
转换成其他任何值,但 null == undefined
会返回 true 。ECMAScript 规范中是这样定义的。
6.2 判断 null 和 undefined
参考:https://blog.csdn.net/weixin_43532415/article/details/108930839
6.2.1 判断 null
以下是不正确的用法:
var exp = null; if (exp == null) { console.log("is null"); } // exp 为 undefined 时,也会得到与 null 相同的结果,虽然 null 和 undefined 不一样。注意:要同时判断 null 和 undefined 时可使用本法。 var exp = null; if (!exp) { console.loh("is null"); } // 如果 exp 为 undefined 或者数字零,也会得到与 null 相同的结果,虽然 null 和二者不一样。注意:要同时判断 null、undefined 和数字零时可使用本法。 var exp = null; if (typeof(exp) == "null") { console.log("is null"); } // 为了向下兼容,exp 为 null 时,typeof 总返回 object。 var exp = null; if (isNull(exp)) { console.log("is null"); } // JavaScript 中没有 isNull 这个函数。
以下是正确的用法:
var exp = null; if (!exp && typeof(exp)!="undefined" && exp!=0) { console.log("is null"); }
尽管如此,我们在 DOM
应用中,一般只需要用(!exp)
来判断就可以了,因为 DOM
应用中,可能返回 null
,可能返回 undefined
,如果具体判断 null
还是 undefined
会使程序过于复杂。
6.2.2 判断 undefined
以下是不正确的用法:
var exp = undefined; if (exp == undefined){ console.log("undefined"); }
exp
为 null
时,也会得到与 undefined
相同的结果,虽然 null
和 undefined
不一样。注意:要同时判断 undefined
和 null
时可使用本法。
以下是正确的用法:
var exp = undefined; if (typeof(exp) == "undefined"){ console.log("undefined"); }
7. 判断变量类型
使用 typeof 即可,首先判断是否为null,之后用typeof,如果是object 的话,再用array.isarray 判断是否为数组,如果是数字的话用isNaN 判断是否是 NaN 即可
扩展学习
JS 采用的是词法作用域,也就是静态作用域,所以函数的作用域在函数定义的时候就决定了,
看如下例子:
var value = 1; function foo() { console.log(value); } function bar() { var value = 2; foo(); } bar();
假设JavaScript 采用静态作用域,让我们分析下执行过程:执行foo 函数,先从foo 函数内部查找是否有局部变量value,如果没有,就根据书写的位置,查找上面一层的代码,也就是value 等于1,所以结果会打印1。
假设JavaScript 采用动态作用域,让我们分析下执行过程:执行foo 函数,依然是从foo 函数内部查找是否有局部变量value。如果没有,就从调用函数的作用域,也就是bar 函数内部查找value 变量,所以结果会打印2。
前面我们已经说了,JavaScript 采用的是静态作用域,所以这个例子的结果是1。
前端技术分享