js 数据类型
2023-12-17 18:37:28
js的八种数据类型:
基本类型(基本类型):Number,String,Boolean,Undefined,Null,Symbol
引用数据类型(对象类型):Object,Array,Function
Undefined
Undefined只有一个唯一的值:undefined。
undefined出现的常见两种情况:
- 未定义的变量,使用typeof对这个变量进行操作会返回undefined。如果使用其他的操作符来检测该变量的数据类型,会报错。
console.log(typeof data)
- 定义了的变量,但是还未初始化或者是这个变量初始化为undefined,这个变量的值就是undefined。一般来说,我们没有必要把一个变量显示初始化为undefined,因为会默认为undefined。
let data; console.log(data)
undefined判断:
- 使用严格相等符===或者不相等操作符!==来进行判断,不能使用==,因为==会检查变量是否为null,但是===就不检查。注意null 不等同于 undefined。
- 使用typeof操作符。
Null
Null只有一个唯一的值:null。它是一个字面量,空值,null表示一个空指针,表示对象没有指向任何对象。
null判断:
使用严格相等符===或者不相等操作符!==来进行判断,不能使用==。,因为==会检查变量是否为undefined。
不能使用typeof判断,因为typeof会判断null为一个对象。
if(data === null){
console.log("yes");
}
在什么时候使用null?
- 定义的变量在后续中会用来保存数据,但是现在还没有保存,就要把这变量的值初始化为null。
- 当这个数据不要需要时,把这个数据设置为null,解除引用。
undefined和null判断
console.log(null == undefined); //true
console.log(null === undefined); //false
Symbol
Symbol是ES6引入的一种数据类型,表示独一无二的值,Symbol是一个类似于字符串的数据类型。
symbol的注意事项:
- Symbol函数前不能使用new命令,会报错。
- Symbol使用typeof判断变量类型会显示为Symbol类型。
- Symbol创建时的参数:
- 字符串
- 对象,调用对象的toString方法,将其转换为字符串,生成一个Symbol值
const obj = { toString(){ return 'abc'; } }; const sym = Symbol(obj); sym // Symbol('abc');
- 相同参数的Symbol函数的返回值是不相等的,Symbol函数的参数只表示当前symbol值的描述。?
var s1 = Symbol('foo'); var s2 = Symbol('foo'); s1 === s2//false
- Symbol值不能与其他类型的值进行运算,会报错,但是Symbol可以转换成其他类型的值。
- 显式转为字符串
var sym = Symbol('symbol'); sym.toString(); String(sym);
- 显式转为布尔值
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的区别:
- 返回值不同:typeof返回的是一个字符串,instanceof返回的是一个布尔值。
- typeof可以用来检查基本数据类型和函数,但是对数组和null处理不够准确。
- instanceof用于检查对象是否是特定类的实例,可以很好的处理继承关系,具有灵活性。
文章来源:https://blog.csdn.net/bu_xiang_tutou/article/details/135013694
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!