typeof操作符

typeof 操作符返回一个字符串,表示未经计算的操作数的类型。

// 数值
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof(42) === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // 尽管它是 "Not-A-Number" (非数值) 的缩写
typeof Number(1) === 'number'; // Number 会尝试把参数解析成数值 typeof 42n === 'bigint'; // 字符串
typeof '' === 'string';
typeof 'bla' === 'string';
typeof `template literal` === 'string';
typeof '1' === 'string'; // 注意内容为数字的字符串仍是字符串
typeof (typeof 1) === 'string'; // typeof 总是返回一个字符串
typeof String(1) === 'string'; // String 将任意值转换为字符串,比 toString 更安全 // 布尔值
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(1) === 'boolean'; // Boolean() 会基于参数是真值还是虚值进行转换
typeof !!(1) === 'boolean'; // 两次调用 ! (逻辑非) 操作符相当于 Boolean() // Symbols
typeof Symbol() === 'symbol';
typeof Symbol('foo') === 'symbol';
typeof Symbol.iterator === 'symbol'; // Undefined
typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined'; // 对象
typeof {a: 1} === 'object'; // 使用 Array.isArray 或者 Object.prototype.toString.call
// 区分数组和普通对象
typeof [1, 2, 4] === 'object'; typeof new Date() === 'object';
typeof /regex/ === 'object'; // 历史结果请参阅正则表达式部分 // 下面的例子令人迷惑,非常危险,没有用处。避免使用它们。
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String('abc') === 'object'; // 函数
typeof function() {} === 'function';
typeof class C {} === 'function'
typeof Math.sin === 'function';

  

在JavaScript最初的实现中,JavaScript中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是0。由于null代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签是0,typeof null也因此返回 "object"。

在 ECMAScript 2015 之前,typeof 总能保证对任何所给的操作数返回一个字符串。即便是没有声明的标识符,typeof 也能返回 'undefined'。使用 typeof 永远不会抛出错误。

但在加入了块级作用域的 let 和 const 之后,在其被声明之前对块中的 let 和 const 变量使用 typeof 会抛出一个 ReferenceError。块作用域变量在块的头部处于“暂存死区”,直至其被初始化,在这期间,访问变量将会引发错误

Undefined类型

Undefined类型只有一个值,即undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。

null类型

Null类型也是只有一个值:null。位于null和undefined之间的相等操作符(==)总是返回true。

在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。这样做不仅可以体现null作为空对象指针的惯例,而且有助于进一步区分null和undefined。

Boolean类型

该类型只有两个值:true和false

数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非零字符串 0和NaN
Undefined   undefined
Object 任何对象 null

Number类型

该类型使用IEEE754格式表示整数和浮点数值。 浮点数值:数值中必须包含一位小数点,并且小数点后面必须至少有一位数字。

保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转换为整数值。显然,如果小数点后面没有跟任何数字,那么这个数值就可以作为整数值来保存。同样地,如果浮点数值本身表示就是一个整数(1.0),那么该值也会被转换为整数。

1、数值范围
由于内存的限制,ECMAScript并不能保存世界上所有的数值。ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中--大多数浏览器,这个值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE中--大多数浏览器,这个值是1.797....e+308。如果超出了就被自动转换为Infinity值。

使用isFinite()来检测是否为Infinity

2、NaN
即非数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。任何数值除以0都会返回NaN。NaN与任何值比较都不相等,包括NaN本身。

使用isNaN()函数来检测某个值是否为NaN

3、数值转换
1、Number()-可以用于任何数据类型

  • 如果是Boolean值,true和false将分别被转换为1和0.
  • 如果是数字,只是简单的传入与返回。
  • 如果是null,返回0。
  • 如果是undefined,返回NaN。
  • 如果是字符串,遵循下列规则:
    如果字符串中只包含数字,则将其转为了十进制数值;
    如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值;
    如果字符串中包含有效的十六进制格式数字,则将其转换为相同大小的十进制整数;
    如果字符串是空的,则将其转换为0;
    如果字符串中包含上述格式之外的值,则将其转为NaN。
  • 如果是对象,则调用对象的valueof()方法,然后依照上述规则进行转换。如果转换的结果是NaN,则调用对象的toString()方法,然后再次根据上述规则进行转换返回的字符串。

2、parseInt()

  • 忽略字符串前面的空格,直至找到第一个非空格字符。
  • 如果第一个字符不是数字或者负号,返回NaN
  • 空字符转换为NaN。
  • 如果第一个字符是数字,则继续解析下面字符,直到完成所有字符的解析或者遇到了一个非数字字符。
  • 函数提供第二个参数:转换时使用的基数(多少进制)

3、parseFloat()

  • 与parseInt()函数类似,从一个字符开始解析每个字符,一直解析到字符串的末尾或者遇见一个无效的浮点数字符为止。

String类型

String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。可以由双引号或者单引号表示。

1、字符串特点
ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变原来保存的值,首先要销毁原来的字符串,然后在用另一个新值填充该变量。

2、转换为字符串

  • toString():数值,布尔值、对象和字符串值都有一个toString()方法。但null和undefined没有这个方法。
    多数情况下,不需要传入参数。但是,在调用数值的toString()方法时,可以传递一个参数:输出数值的基数。
  • 在不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。
  • String()函数遵循下列转换规则:
    如果值有toString(),则调用该方法并返回相应的结果。
    如果值是null,返回'null',
    如果是undefined,返回'undefined'

Object类型

ECMAString中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。

Object的每个实例都具有下列的属性和方法:

  • constructor:保存着用于创建当前对象的函数。
  • hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在。
  • isPrototypeOf(Object):用于检查传入的对象是否为传入对象的原型。
  • propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。
  • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
  • toString():返回的对象的字符串表示
  • valueOf():返回对象的字符串、数值或布尔值表示。

位操作符

位操作符用于在最基本的层面上,即按内存中表示数值的位来操作数值。ECMAScript中的所有数值以IEEE-754 64位格式存储,但位操作符并不直接操作64位的值。而是将64位的值转换为32位整数,然后执行操作,最后将结果转换为64位。

对于有有符号整数,前31位用于表示整数的值。第32位用于表示数值的符号:0表示整数,1表示负数。这个表示符号的位叫做符号位,符号位的值决定了其他位数值的格式。其中,正数以纯二进制格式存储,31位中的每一位都表示2的幂。

负数同样以二进制码存储,但使用的格式是二进制补码。计算一个数值的二进制补码,需要经过下列3个步骤:

  • 求这个数值绝对值的二进制码
  • 求二进制反码,即将0转换为1,1转换为0;
  • 得到二进制反码加1。

有一个严重的副作用,即对于特殊的NaN和Infinity值应用位操作时,这两个值都会被当成0来处理。

对于非数值应用位操作符,会先使用Number()函数将该值转换位一个数值,然后应用位操作符。

1、按位非(NOT)
由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码。 本质是操作数的负值减1。
var num1 = 25 // 00000000000000000000000000011001
var num2 = ~num1 // 11111111111111111111111111100110

2、按位与(AND)
由一个和号字符(&)表示,它有两个操作数。从本质上讲,按位与操作就是将两个数值的每一位对齐,然后根据下表中的规则,对相同位置上的两个数执行AND操作。

按位与操作只在两个数值的对应位都是1时才返回1,任何一位是0,结果是0.

3、按位或(or) 由一个竖线(|)表示,同样也有两个操作数。按位或操作在有一个位是1的情况下就返回1,而只有在两个位都是0的情况下才返回0.

4、按位异或(XOR) 由一个插入符号(^)表示。按位异或与按位或的不同之处在于,这个操作在两个数值对应位上只有一个1时才返回1,如果对应两位都是1或都是0,返回0。

5、左移
由两个小于号(<<)表示,这个操作符会将数值的所有位向坐移动指定的位数。例如将数值2(二进制码为10)向左移动5位,结果就是64(二进制码为1000000)

6、有符号右移
由两个大于号(>>)表示,这个操作符会将数值向右移动,但保留符号位(即正负号)。有符号右移与左移操作恰好相反。

7、无符号右移
由三个大于号(>>>)表示,这个操作符会将数值的所有32位向右移动。对正数来说,无符号右移的结果与有符号右移的结果相同。

布尔操作符

1、逻辑非
由一个叹号(!)表示。可以用于ECMAScript任何值。都会返回一个布尔值。遵循下列规则:

  • 如果操作数是一个对象,返回false;
  • 如果操作数是一个空字符串。返回true;
  • 如果操作数是一个非空字符串,返回false;
  • 如果操作数是数值0,返回true;
  • 如果操作数是任意非0数值(包括Infinity),返回false;
  • 如果操作数是null,返回true。
  • 如果操作数是NaN,返回true。
  • 如果操作数是undefined,返回true。

同时使用两个逻辑非操作符,实际上就会模拟Boolean()转型函数的行为。其中,第一个逻辑非操作会基于无论什么操作数返回一个布尔值,而第二个逻辑非操作则对该布尔值求反。

2、逻辑与
由两个和号(&&)表示。

  • 如果第一个操作数是对象,则返回第二个操作数。
  • 如果第二个操作数是对象,则只有在第一个操作数的求值结果位true的情况下才会返回该对象。
  • 如果两个操作数是对象,则返回第二个操作数。
  • 如果有一个操作数是null,则返回null。
  • 如果有一个操作数是NaN,则返回NaN。
  • 如果有一个操作数是undefined,则返回undefined。

3、逻辑或
由两个竖线(||)表示。

  • 如果第一个操作数是对象,则返回第一个操作数;
  • 如果第一个操作数求值结果为false,则返回第二个操作数;
  • 如果两个操作数是对象,则返回第一个操作数;
  • 如果两个操作数是null,则返回第一个操作数;
  • 如果两个操作数是NaN,则返回NaN;
  • 如果两个操作数是Undefined,则返回undefined。

4、==

  • 如果有一个操作数是布尔值,则在比较前先将其转换为数值--false转换为0,而true转换为1.
  • 如果有一个操作数是字符串,另一个操作数是数值,在比较前将字符串转换为数值。
  • 如果有一个操作数是对象,另一个操作数不是,则调用对象的valueof()方法,用得到的基本类型值按照前面的规则进行比较。
  • null和undefined是相等的。
  • 不能将null和undefined转换为其他任何值。
  • 如果有一个操作数是NaN,则返回false。

函数

1、理解参数
ECMAScript函数的参数与大多数其他语言中函数的参数有所不同。ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。原因是ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组。这是事实说明了ECMAScript函数的一个重要特点:命名的参数只提供便利,但不是必需的。

2、没有重载
ECMAScript函数不能像传统意义上那样实现重载。而Java中,可以为一个函数便携两个定义,只要这两个定义的签名(接收的参数的类型和数量)不同即可。ECMAScript函数没有签名,因为其参数是由包含零或者多个值的数组来表示的。

作者: zhangwinwin
链接: 基本概念
来源: github

JavaScript基础知识-基本概念的更多相关文章

  1. JavaScript基础知识(概念、常量和变量)

    1.JavaScript概念 JavaScript是脚本语言; 编写之后,可以直接运行(缺失了编译的过程) 2.JavaScript发展 LiveScript    =>    JavaScri ...

  2. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  3. JavaScript 基础知识 - BOM篇

    前言 本篇文章是JavaScript基础知识的BOM篇,如果前面的<JavaScript基础知识-DOM篇>看完了,现在就可以学习BOM了. 注意: 所有的案例都在这里链接: 提取密码密码 ...

  4. Javascript基础知识总结一

    Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

  5. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...

  6. 学习React之前你需要知道的的JavaScript基础知识

    在我的研讨会期间,更多的材料是关于JavaScript而不是React.其中大部分归结为JavaScript ES6以及功能和语法,但也包括三元运算符,语言中的简写版本,此对象,JavaScript内 ...

  7. JavaScript——基础知识,开始我们的js编程之旅吧!

    JavaScript基础第01天 1. 编程语言 编程语言: 可以通过类似于人类语言的"语言"来控制计算机,让计算机为我们做事情,这样的语言就叫做编程语言(Programming ...

  8. (转)JAVA AJAX教程第二章-JAVASCRIPT基础知识

    开篇:JAVASCRIPT是AJAX技术中不可或缺的一部分,所以想学好AJAX以及现在流行的AJAX框架,学好JAVASCRIPT是最重要的.这章我给大家整理了一些JAVASCRIPT的基础知识.常用 ...

  9. JavaScript基础知识整理

    只整理基础知识中关键技术,旨在系统性的学习和备忘. 1.在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值NaN ...

随机推荐

  1. 解决UE4缓存使C盘膨胀的问题

    使用UE4的时候会发现C盘越来越小了,那是因为UE4引擎的缓存文件默认保存在C盘的缘故. 概述 一.出现的问题:UE4的缓存文件会导致C盘膨胀. 二.解决的方式:请严格按照下列步骤来执行.1. 更改U ...

  2. 手把手教你用SonarQube+Jenkins搭建--前端项目--代码质量管理平台 (Window系统)

    前言 网上教程大多介绍的是Linux系统下SonarQube+Jenkins如何使用,这是因为这两款软件一般都是部署在服务器上,而大多数服务器,采用的都是Linux系统.大多数服务器用Linux的原因 ...

  3. 使用JMeter进行压力测试

    使用JMeter进行压力测试(基础篇) 1.启动Jmeter 双击图中所示文件出现如下图所示即启动成功 2 新建测试计划 File------>new 2.1右键新建线程组 add-----&g ...

  4. C语言基础二维数组

    (1)二位数组的定义int array[n][m],行下标的取值范围是0~n-1,列下标的取值范围是0~m-1,二维数组最大下标元素是array[n-1][m-1]:如定义一个3行4列的数组 int ...

  5. Java常用类学习笔记总结

    Java常用类 java.lang.String类的使用 1.概述 String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String ...

  6. ES6模板字符串及字符串的扩展方法

    一.ES6模板字符串 传统定义字符串的方式是: const str='hello es2015,this is a string' ES6新增了一种定义字符串的方式用反引号进行标识 const str ...

  7. Elasticsearch java api操作(二)(Java High Level Rest Client)

    一.说明: 一.Elasticsearch提供了两个JAVA REST Client版本: 1.java low level rest client: 低级别的rest客户端,通过http与集群交互, ...

  8. 《Go 语言并发之道》读后感 - 第一章

    <Go 语言并发之道>读后感 - 第一章 前言 人生路漫漫,总有一本书帮助你在某条道路上打通任督二脉,<Go 语言并发之道>就是我作为一个 Gopher 道路上的一本打通任督二 ...

  9. Golang字符串是否存在于切片或数组中的小工具(基本等同于python in语法)

    // golang中是没有判断字符串是否存在数组或切片里的内置方法, 所以我们可以自己搞一个快速小组件 func Find(slice []string, val string) (int, bool ...

  10. java进阶(29)--HashMap集合

    一.HashMap简介 1.HashMap底层是哈希表结构,类似字典,初始化如下: 2.哈希表结构: 是一个数组+单向链表的结构体 数组:查询效率较高,随机增删效率很低 单向链表:在随机增删方面效率较 ...