运算符】JS 中形如 instanceof、typeof 等这些为什么被设计成了运算符而不是一个函数?

2020-04-29 12:50发布

1条回答
奥利给
2楼 · 2020-04-29 19:29

typeof 运算符

返回一个用来表示表达式的数据类型的字符串。

typeof expression ;

expression 参数是需要查找类型信息的任意表达式。

说明

typeof 是一个一元运算符,放在一个运算数之前。

typeof 运算符把类型信息当作字符串返回。typeof 返回值有六种可能: “number” ,“string”, “boolean”, “object” ,“function”, 和 “undefined.”

(而 ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。)

注释:

1、我们上面提到了ECMAScript的5种原始类型,在使用typeof操作符时,我们需要特别区分"对象类型"与"对象值"(字面值)的差别。例如Boolean 对象是 Boolean 原始类型的引用类型,而true和false则是Boolean对象的两个可能的对象值。我们可以把 ECMAScript的预定义对象(相对于其他语言中的类)看作是 相应类型的原始值的封装(或包装)。而ECMAScript的所有预定义对象又都是继承于Object对象。因此存在如下情况:

  var testvar= new Number(68);
  alert(typeof testvar);  //输出  "object"
  testvar= 68;
  alert(typeof testvar);  //输出  "number"

又如: 

  function Person(){}
  [removed] ("
typeof(Person):"+typeof(Person));    //function
  var person = new Person();
  [removed] ("
typeof(person):"+typeof(person));    //object

注意:从传统意义上来说,ECMAScript 并不真正具有类。事实上,除了说明不存在类,在 ECMA-262 中根本没有出现“类”这个词。ECMAScript 定义了“对象定义”,逻辑上等价于其他程序设计语言中的类

引申:JavaScript中的instanceof操作符的原理是什么?

   学习js时,了解到在判断js中一个实例是否属于某一种类型时,可以使用instanceof操作符,比如function Person(){}

var person = new Person();  alert(person instanceof Person);//返回true

那么在执行instanceof这个操作时经过了怎样的判断,返回了true/false?

会不会是通过判断Person.prototype与person的内部指针[[prototype]]两者引用是否相同而得出结果的?

 

其实,凡是能在实例的"原型对象链"中找到该构造函数的prototype属性所指向的原型对象,就返回true。

而prototype根本就不是实例具有的属性(或者说实例的prototype属性为undefined),而是它原型对象中的属性,如果被篡改了,这个判断方法就不能正确返回了。


相关问题推荐

  • 回答 2

    比较运算符 名称说明示例结果==等于比较两个数值(数字、布尔)是否相同9==9true8==7false!=不等于比较两个数值(数字、布尔)是不同6!=6false5!=8true大于检查左边的数是否大于右边的数9>6true6>9false=6true...

  • 回答 1

    ()1!(很高)、++、--2先*、/、%后+、-3>、>=、

  • 回答 15

    =     不能用于 NULL的比较  和 = 类型,,不同在于 值魏NULL 也可以正确的比较;BETWEEN 的用法,a BETWEEN min  ADD max ; 相当于是 a在 min和 max之间;可以等于min和max;in  的用法 a in(1,2,3,4,5) ,a 是否存在 1 2 3 4 5  中;a  IS  NULL ;...

  • 回答 9

    =:把右边的内容赋值给左边+=,-=,*=,/=,%=:把左边的和右边的操作后赋值给左边。注意:        +=隐含了强制类型转换。        x+=y;等价与:x = (x的数据类型)(x + y);

  • 回答 10

    不是算术运算符中,乘法运算符【*】、除法运算符【/】、取余运算符【%】属于优先级第三级,加法运算符【+】、减法运算符【-】属于第四级。关系运算符有6种关系,分别为小于、小于等于、大于、等于、大于等于、不等于。其中,关系运算符【< > = 】属于优先级第...

  • 回答 13

    算术运算符中,乘法运算符【*】、除法运算符【/】、取余运算符【%】属于优先级第三级,加法运算符【+】、减法运算符【-】属于第四级。关系运算符有6种关系,分别为小于、小于等于、大于、等于、大于等于、不等于。其中,关系运算符【< > = 】属于优先级第六级...

  • 回答 5

    基本的赋值运算符是=。他的优先级别低于其他的运算符,所以对该运算符往往最后读取。

  • 回答 13

    当然是右结合。譬如这个表达式: a == b ? a : b ? c : d它的结合是这样的 a == b ? a : (b ? c : d)如果是左结合,它的结合是这样的: a == (b ? a : b) ? c : d

  • 回答 12

    算术运算符中,乘法运算符【*】、除法运算符【/】、取余运算符【%】属于优先级第三级,加法运算符【+】、减法运算符【-】属于第四级。关系运算符有6种关系,分别为小于、小于等于、大于、等于、大于等于、不等于。其中,关系运算符【< > = 】属于优先级第六级...

  • 回答 8

    1、= 赋值运算 符:变量=表达式,如:a=3,将a的值赋为3;2、/= 除后赋值:变量/=表达式,如:a/=3,即a=a/3;3、*= 乘后赋值:变量*=表达式,如:a*=3,即a=a*3;4、%= 取模后赋值:变量%=表达式,如:a%=3,即a=a%3;5、+= 加后赋值:变量+=表达式,如:a+=...

  • 回答 8

    一、> :右移运算符,num >> 1,相当于num除以2三、>>> :无符号右移,忽略符号位,高位都以0补齐,无符号右移运算符>>> 只是对32位和64位的值有意义四、& :与运算,符号两边都为true,结果才是true,否则为false;对于数字,可将数字转换为2进制形式去理解,...

  • 回答 4

    所有的数学运算都认为是从左向右运算的,Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。乘法和加法是两个可结合的运算,也就是...

  • 回答 5

    一.算术运算符算数运算符是完全符合数学运算的规律,其中包括:+ (加法运算)、- (减法运算)、*(乘法运算)、/ (除法运算)、%(取余)、++(自加运算)、–(自减运算)、++i; i先+1再参与运算、--i; i先-1再参与运算、i++; 先运算再+1、i--; 先运算再-1二、关系比...

  • 回答 1

    以下运算符优知先级顺序依次递增: Lambda  #运算优先级最低逻辑道运算符: or逻辑运算符: and逻辑运算符:not成员测试: in, not in同一性专测试: is, is not比较: =,!=,==按位或: |按位异或: ^按位与: &移位: 加法与减法: + ,-乘法、除法与...

  • 回答 1

    如下:

没有解决我的问题,去提问