错题分析(js)---->js全局函数 --基本数据类型 --->typeof 和 instanceof 区别 ---->判断数据类型

JavaScript的全局函数:

abc JavaScript 中包含以下 7 个全局函数,用于完成一些常用的功能(以后的章节中可能会用到):
escape( )、eval_r( )、isFinite( )、isNaN( )、parseFloat( )、parseInt( )、unescape( )。

函数 详细描述

decodeURI() 解码某个编码的 URI。
decodeURIComponent() 解码一个编码的 URI 组件。
encodeURI() 把字符串编码为 URI。
encodeURIComponent() 把字符串编码为 URI 组件。
escape() 对字符串进行编码。
eval() 计算 JavaScript 字符串,并把它作为脚本代码来执行。
isFinite() 检查某个值是否为有穷大的数。
isNaN() 检查某个值是否是数字。
Number() 把对象的值转换为数字。
parseFloat() 解析一个字符串并返回一个浮点数。
parseInt() 解析一个字符串并返回一个整数。
String() 把对象的值转换为字符串。
unescape() 对由 escape() 编码的字符串进行解码。

基本类型分为以下六种:

string(字符串)
boolean(布尔值)
number(数字)
symbol(符号)
null(空值)
undefined(未定义)
string 、number 、boolean 和 null undefined 这五种类型统称为原始类型
ymbol是ES6中新增的数据类型,symbol 表示独一无二的值
null 和 undefined 通常被认为是特殊值,这两种类型的值唯一,就是其本身。

typeof返回的类型

在这里插入图片描述
es6新增

string number boolean undefined object function symbol(es6新增)
typeof Symbol()    //"symbol"
typeof Number()    //"number"
typeof String()    //"string"
typeof Function()    //"function"
typeof Object()    //"object"
typeof Boolean()    //"boolean"
typeof null    //"object"
typeof undefined    //"undefined"

number、string、boolean、undefined、function、object共6种。
注意:其中Array与null返回的都是object ,function(){}与class{}返回的都是function

**扩展: ** typeof 和 instanceof 区别

typeof 可以判断变量的数据类型,返回值是字符串;
a instanceof b ,是判断 b 是不是在 a 的原型链上, 也可以实现判断
数据类型, 返回值为布尔.

详细解释:

 javascript 中,判断一个变量的类型可以用 typeof
1、数字类型、typeof 返回的值是 number。比如说:typeof(1),返回值是 number
2、字符串类型,typeof 返回的值是 string。比如 typeof(123”返回值时 string)
3、布尔类型,typeof 返回的值是 boolean。比如 typeof(true)返回值时 boolean
4、对象、数组、null 返回的值是 object。比如 typeof(window)typeof(document)typeof(null)返回的值都是 object
 5、函数类型,返回的值是 function。比如:typeof(eval)typeof(Date)返回的值都是
function。
 6、不存在的变量、函数或者 undefined,将返回 undefined。比如:typeof(abc)typeof(undefined)都返回 undefined
 在 javascript 中,instanceof 用于判断某个对象是否被另一个函数构造
使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它
都返回”object”。ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题。
Instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同
的是,instanceof 方法要求开发者明确地确认对象为某特定类型

判断obj对象是否具有val属性

var obj={
    
    }
……..
obj.hasOwnProperty("val")

hasOwnProperty: 是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
isPrototypeOf : 是用来判断要检查其原型链的对象是否存在于指定对象实例中,是则返回true,否则返回false。

hasOwnProperty:从字面上理解,是属于自己私有的属性,不是公共的。因此,只能是检测实例自己的属性,不能是原型对象上的属性。
hasPrototypeProperty:从字面上就可以知道是检测原型对象上的属性。

详细扩展: 判断数据类型

概述: 四种方法:typeof,instanceof,constructor,Object.prototype.toString。

扩展:万物皆对象,是不准确的。

目前有七种数据类型:string,number,boolean, undefined, null, symbol(es6加入的,表示独一无二的值),object。

object的九个内置对象:String,Number,Boolean,Object,Function,Array,Date,RegExp,Error。

当程序运行时,js引擎会将基本数据类型转成内置对象,如字面量string转换成 String 对象。所以才会有一种万物皆对象的假象,因为js引擎帮你做了。

1. typeof
typeof只能判断六种数据类型,但是null判断为object,原因是二进制null全是0,typeof判断二进制为 3个0 就是object。

typeof ‘abc’; // string
typeof 1; // number
typeof true; //boolean
typeof undefined; //undefined
typeof null; //object
typeof Symbol(); // symbol
typeof new Function(); // function
typeof [] ; //object
typeof new Date(); //object
typeof new RegExp(); //object
typeof new Error(); //object
2. constructor
constructor是object的内置对象自带的,所以只能验证九个内置对象。

因为string、number、boolean,js引擎在运行时,将其转化为object内置对象,所以可以判断;
但是null、 undefined没有constructor,还有Symbol.constructor是Function,所以判断不对。

还有constructor在开发者重写prototype时,constructor会丢失,所以这个判断并不安全。原因在我上篇文章:原型与原型链

 'abc'.constructor === String,
  new Number(1).constructor == Number,
  true.constructor === Boolean,
  new Function().constructor === Function,
  Symbol.constructor === Function
  [].constructor === Array,
  {
    
    }.constructor === Object,
  new Date().constructor === Date,
  new RegExp().constructor === RegExp,
  new Error().constructor === Error

3. Object.prototype.toString
  `toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的[[Class]] 。这是一个内部属性,其格式为 [object type],其中 type 就是对象的类型。
  对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

Object.prototype.toString.call('abc') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]

最完美的判断数据类型方案了,但是有一种情况判断不了,那就是判断A 是否为 B 的实例。

function Foo() {}
var f = new Foo();
console.log(Object.prototype.toString.call(f)); // [object Object]
4. instanceof
instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。

4.1 应用篇

 'abc' instanceof String; // false
  1 instanceof Number; // false
  true instanceof Boolean; // false
  [] instanceof Array; // true
  [] instanceof Object; // true
  {
    
    } instanceof Object; // true
  new Function() instanceof Function; // true
  new Date() instanceof Date; // true
  new RegExp() instanceof RegExp; // true
  new Error() instanceof Error; // true

首先null,underfined不能instanceof;
其次string, number ,boolean判断为false;
[] instanceof Array是true,[] instanceof Object也是true;
所以instanceof千万别用来判断数据类型。它的主要作用就是判断Object.prototype.toString实现不了的情况:

function Foo() {}
var f = new Foo();
console.log(f instanceof Foo); // true
4.2 原理篇
我们用一段伪代码来模拟其内部执行过程:

instanceof (A,B) = {
    
    
    var L = A.__proto__;
    var R = B.prototype;
    if(L === R) {
    
    
        // A的内部属性 __proto__ 指向 B 的原型对象
        return true;
    }
    return false;
}

我们来分析一下 [ ]、Array、Object 三者之间的关系:
在这里插入图片描述

从原型链可以看出,[] 的 proto 直接指向Array.prototype,间接指向 Object.prototype,所以按照 nstanceof的判断规则,[] 就是Object的实例。
同理,所以内置对象最终都是指向Object.prototype。

总结:instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。

猜你喜欢

转载自blog.csdn.net/qq_43944285/article/details/125032603
今日推荐