js 数据类型

2023-12-17 18:37:28

js的八种数据类型:

基本类型(基本类型):Number,String,Boolean,Undefined,Null,Symbol

引用数据类型(对象类型):Object,Array,Function

Undefined

Undefined只有一个唯一的值:undefined。

undefined出现的常见两种情况:

  1. 未定义的变量,使用typeof对这个变量进行操作会返回undefined。如果使用其他的操作符来检测该变量的数据类型,会报错。
    console.log(typeof data)
  2. 定义了的变量,但是还未初始化或者是这个变量初始化为undefined,这个变量的值就是undefined。一般来说,我们没有必要把一个变量显示初始化为undefined,因为会默认为undefined。
    let data;
    console.log(data)

undefined判断:

  1. 使用严格相等符===或者不相等操作符!==来进行判断,不能使用==,因为==会检查变量是否为null,但是===就不检查。注意null 不等同于 undefined。
  2. 使用typeof操作符。

Null

Null只有一个唯一的值:null。它是一个字面量,空值,null表示一个空指针,表示对象没有指向任何对象。

null判断:

使用严格相等符===或者不相等操作符!==来进行判断,不能使用==。,因为==会检查变量是否为undefined。

不能使用typeof判断,因为typeof会判断null为一个对象。

if(data === null){
       console.log("yes");
   }

在什么时候使用null?

  1. 定义的变量在后续中会用来保存数据,但是现在还没有保存,就要把这变量的值初始化为null。
  2. 当这个数据不要需要时,把这个数据设置为null,解除引用。

undefined和null判断

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

Symbol

Symbol是ES6引入的一种数据类型,表示独一无二的值,Symbol是一个类似于字符串的数据类型。

symbol的注意事项:

  1. Symbol函数前不能使用new命令,会报错。
  2. Symbol使用typeof判断变量类型会显示为Symbol类型。
  3. Symbol创建时的参数:
    1. 字符串
    2. 对象,调用对象的toString方法,将其转换为字符串,生成一个Symbol值
      const obj = {
          toString(){
              return 'abc';
          }
      };
      const sym = Symbol(obj);
      sym // Symbol('abc');
  4. 相同参数的Symbol函数的返回值是不相等的,Symbol函数的参数只表示当前symbol值的描述。?
    var s1 = Symbol('foo');
    var s2 = Symbol('foo');
    s1 === s2//false
  5. Symbol值不能与其他类型的值进行运算,会报错,但是Symbol可以转换成其他类型的值。
    1. 显式转为字符串
      var sym = Symbol('symbol');
      sym.toString();
      String(sym);
    2. 显式转为布尔值
      Boolean(sym);

Symbol作为属性名:

每个Symbol值都是不相等的,Symbol作为标识符用于对象的属性名,不会出现同名的属性。

Symbol值作为属性名时,该属性是公开属性,不是私有属性。

Symbol作为属性名写法:
var mySymbol = Symbol();

// 第一种
var a = {};
a[mySymbol] = "hello!";

// 第二种
var a = {
    [mySymbol]: "hello!"
}

// 第三种
var a = {};
Object.defineProperty(a, mySymbol, { value: 'hello!' });

//结果
a[mySymbol] // "hello!"

?Symbol值作为对象属性名时,不能使用点运算符。

解释:点运算符后面总是字符串,所以不会读取mySymbol作为标识名所指代的值,导致a的属性名实际上是一个字符串。不是一个Symbol值。

简化obj对象的写法:

// 增强的对象写法
let s = Symbol();
let obj = {
    [s] (arg) {
    }
}

Symbol定义常量,保证这组常量的值是不相等的。

常量值命名要大写字母+下划线。

log.levels = {
    DEBUG: Symbol('debug'),
}
log(log.levels.DEBUG)

instanceof 和 typeof?

instanceof

instanceof用来检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。即检查对象是否是特定类(或构造函数)的实例。可以用来确定对象的继承关系、

object instanceof constructor

let Car = function() {}
let benz = new Car()
benz instanceof Car // true

instanceof的实现原理:

function instanceof(obj, constructor) {
    // obj的隐式原型
    let implicitPrototype = obj?.__proto__;
    // 构造函数的原型
    const displayPrototype = constructor.prototype;
    // 遍历原型链
    while (implicitPrototype) {
        // 找到,返回true
        if (implicitPrototype === displayPrototype) return true;
        implicitPrototype = implicitPrototype.__proto__;
    }
    return false;
}

typeof

typeof返回一个字符串,表示传入参数的类型。

typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'

// 无法准确检测 null 和 数组
typeof null // 'object'
typeof [] // 'object'

typeof {} // 'object'
typeof console.log // 'function'

判断一个变量是否存在:

if(typeof a != 'undefined'){//变量存在
}

instanceof和typeof的区别:

  1. 返回值不同:typeof返回的是一个字符串,instanceof返回的是一个布尔值。
  2. typeof可以用来检查基本数据类型和函数,但是对数组和null处理不够准确
  3. instanceof用于检查对象是否是特定类的实例,可以很好的处理继承关系,具有灵活性。

文章来源:https://blog.csdn.net/bu_xiang_tutou/article/details/135013694
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。