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

目前 nullundefined 基本是同义的,只有一些细微的差别,null 表示没有对象,undefined 表示缺少值,就是此处应该有一个值但是还没有定义。

undefined==null 返回 true。

6.1 为什么 null == undifined

要比较相等性之前,不能将 nullundefined 转换成其他任何值,但 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");
}

expnull 时,也会得到与 undefined 相同的结果,虽然 nullundefined 不一样。注意:要同时判断 undefinednull 时可使用本法。

以下是正确的用法:

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

JavaScript 文章被收录于专栏

前端技术分享

全部评论

相关推荐

贺兰星辰:不要漏个人信息,除了简历模板不太好以外你这个个人简介是不是太夸大了...
点赞 评论 收藏
分享
已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
评论
1
1
分享
牛客网
牛客企业服务