内容
---语法 上一小节
---数据类型 本小节 操作符
---流程控制语句
---理解函数

操作符
--操作数据值的操作符
--算术(如加减)、位操作符、关系、相等
--ECMAScript操作符可以适用于很多类型的值
--在用于对象时,会先调用对象的valueOf()和(或)toString()方法,以便取得可操作的值

一元操作符
--只能操作一个值

--递增操作符 ++
--递减操作符 --
--都有前置和后置

var age = 11;
++age; //12
age++; //12
age; //13
--age; //12
age--; //12
age; //11

一元加减操作符(+-)
--(-)不变,(-)取负
--不仅仅适用于整数,字符串,布尔值,浮点数,对象都适用于
--(+)等同于Number()方法的效果,(-)再取负数
--对于对象先调用valueOf()和(或)toString方法,再转换值

 +"0.1"; //0.1
-"0.1"; //-0.1
+"z"; //NaN
var o = {
valueOf:function() {
return 2;
}
}
+o; //2

位操作符
--按照内存中表示数值的位来操作值
--ECMAScript中数值都是以IEEE754 64位格式存储
--不直接操作64位的值,而是先转换成32位整数,操作完转回64

--有符号整数,前31位 表示值,第32位表示符号,0为正,1为负
--二进制存储
--负数使用二进制补码存储

--正数的原码=反码=补码

--负数
--反码,符号位不变,其余各位取反
--补码,符号位不变,其余各位取反,再加一
--补码,符号位不变,从前面按位取反,最后一个1即后面的0不变

--ECMAScript会尽力向我们隐藏这些信息,
--当我们想要二进制表示负数时
--我们看到的只是这个负数决定之的二进制码前面加了负号

var num = -18;
num.toString(); //-10010,而不是-01110

--ECMAScript所有整数默认有符号位

--对NaN,Infinity值位操作,会被当成0处理
--对非数值位操作,会使用Number()方法

按位非(NOT)(~)
--(~)波浪线表示
--按位取反,包括符号位
--浮点数,小数点后会被忽略

var num1 = 25; //0 0*26 11001 二进制
var num2 = ~num1; //1 1*26 00110 二进制负数的补码(负数的存储形式)
mun2; //-26 转化为负数可见形式
~1; //-2
~1.9; //-2

--本质 操作数的负值减1

按位与(AND)
-- num & num
--两个操作数每一位对其,进行与操作
25 & 25 //25
25 & ~25 //0
25 & -26 //0

按位或(OR)
-- num | num
--两个操作数每一位对其,进行或操作

25 | 25 //25
25 | -26 //-1 每一位全是-1
25 | ~25 //-1 每一位全是-1

按位异或(XOR)
-- num ^ num
-- 不同为真1,相同为假0

左移
-- num << index
-- 左移不影响符号位
-- 除符号位其余位向左移动index个位数,用0填补空位

4 << 1 //8 100 -> 1000
2 << 5 //64 10 -> 1000000

有符号右移
-- num >> index
-- 右移不影响符号位
-- 除符号位其余位向右移动index个位数,用符号位填补空位

8 >> 1 //4 1000 -> 100
64 >> 5 //2 1000000 -> 10
-5 >> 1 //-3

无符号右移
-- num >>> index
-- 影响符号位
-- 所有位向右移动index个位数,用0填补空位

64 >>> 5; //2
-64 >>> 5; //134217726

布尔操作符
--非(NOT)、与(AND)、或(OR)

逻辑非
-- !x
-- 可用于所有类型,都会返回一个布尔值,逻辑非对其求反

规则
--对象 false
--空字符串 true
--非空字符串 false
-- 0 true
-- 非0(包括Infinity)false
-- null true
-- NaN true
-- undefined true

--两个非操作等同于Boolean()函数

逻辑与
-- && 正常的布尔与操作

当有一个操作数不是布尔值时
--如果第一个是对象,则返回第二个操作数
--如果第二个是对象,当第一个是true时,返回
--如果都是对象,则返回第二个
--有一个null 返回null
--有一个NaN 返回NaN
--有一个undefined 返回undefined

--短路操作,如果第一个能决定结果,就不再对第二个操作符求值
--即如果第一个为false,则无论第二个取任何值都是false

逻辑或
-- || 正常的布尔与操作

如果有一个不是布尔值时,
--如果第一个是对象 返回之
--如果第一个为false 返回第二个
--两个都是对象,返回第一个
--两个都是null 返回null
--都是NaN 返回NaN
--都是undefined 返回之

--也是短路操作 如果第一个为true 则不会对第二个求值

var res = a1 || a2 || a2;

--返回一个有值的结果,经常使用

乘性操作符
--乘法,除法,求模
--非数值会自动Number()

乘法
-- *
-- 超过范围返回 Infinity或者-Infinity
-- 有一个为NaN 返回NaN
-- Infinity * 0 = NaN
-- Infinity * 非0 = Infinity或者-Infinity 取决于有符号数
-- Infinity * Infinity = Infinity

除法
-- /
-- 超过范围返回 Infinity或者-Infinity
-- 有一个为NaN 返回NaN
-- Infinity / Infinity = NaN
-- 0 / 0 = NaN
-- 非零 / 0 = Infinity或者-Infinity 取决于有符号数
-- Infinity / 非0 = Infinity或者-Infinity 取决于有符号数

求模
-- %
-- Infinity % num = NaN
-- num % 0 = NaN
-- Infinity % Infinity = NaN
-- num % Infinity = num
-- 0 % Infinity = 0

加性操作符
--也会转换不同的数据类型,但是比乘性要复杂

加法
-- +

当为数值类型时
-- 有一个是NaN 返回NaN
-- Infinity + Infinity = Infinity
-- -Infinity + -Infinity = -Infinity
-- Infinity + -Infinity = NaN
-- +0 + -0 = +0
-- -0 + +0 = +0
-- +0 + +0 = +0
-- -0 + -0 = -0

如果有一个是字符串
--都是字符串 则拼接
--只有一个是字符串,则把另一个转化为字符串再拼接
--转型按照String() 转型函数(所以有:把某个值 + "" ,等同于String())

减法
-- (-)
-- 有一个NaN 返回NaN
-- Infinity - Infinity = NaN
-- -Infinity - -Infinity = NaN
-- Infinity - -Infinity = Infinity
-- -Infinity - Infinity = -Infinity
-- +0 - +0 = +0
-- -0 - -0 = +0
-- +0 - -0 = +0
-- -0 - +0 = -0
--如果不是数值,会调用Number()转换

关系操作符
-- 小于(<)、大于(>)、小于等于(<=)、大于等于(>=)
--返回布尔值
--都是数值则数值比较
--都是字符串则比较字符串对应的字符编码
--如果一个是数值,则将另一个转换为数值参照Number()方法
--如果是布尔值,也转换

--字符串比较时,比较对应位置的每个字符串字符编码
--大写字母(65~90[A-Z])小于小写字母(97~122[a-z])

奇怪的情况

"23" < "3" //true
"23" < 3 //false
"a" < 3 //false
NaN < 3 //false
NaN >= 3 //false

--有一个NaN,则不管怎么比较结果都是false
-- +(null) = 0, +(undefined) = NaN

相等操作符
--相等不相等(==、!=)、全等不全等(===、!==)

相等不相等(==、!=)
-- 会被强制转换,再比较相等性

--如果有一个是布尔值,则先转换为数值 true-1,false-0
--有一个字符串,另一个数值,则字符串转换为数值
--一个对象,另一个不是则调用对象的valueOf()方法 用得到的基本类型比较

--null == undefined true(undefined派生自null)
--在比较相等性之前不能将null,undefined转化为其他值
--有一个为NaN,==false , != true,两个都为NaN也是
--对象比较,判断是不是同一对象

全等和不全等(===、!==)(推荐使用)
--不提前转化类型
--类型不同返回false
--null===undefined false
--对象比较,同相等不相等

条件操作符(三目运算)
variable = boolean_expression ? true_value : false_value;

赋值操作符(=)
--右边赋值给左边

复合赋值操作
--简化赋值操作,但是不会带来性能提升
-- +=
-- -=
-- *=
-- /=
-- <<=
-- >>=
-- >>>=

var num = 10;
num = num + 5;
//同
num += 5;

逗号操作符
--在一条语句中执行多个操作

vat num1=1, num2=2,num3, num4=4;
--通常用于声明多个变量,可赋值

var num = (3, 2, 3, 5, 6); //num=6
--在赋值中,逗号操作符总会返回表达式中最后一项的值

《JavaScript高级程序设计》读书笔记(三)基本概念第四小节 操作符的更多相关文章

  1. 《javascript高级程序设计》笔记三

    第三章 基本概念 任何语言的核心必然会描述这门语言最基本的工作原理.这部分内容对我们来说,读起来很乏味,甚至会产生困意,但这部分内容却是重要的!我有幸拜读<JavaScript高级程序设计> ...

  2. javascript高级程序设计读书笔记-事件(一)

    读书笔记,写的很乱   事件处理程序   事件处理程序分为三种: 1.html事件2. DOM0级,3,DOM2级别  没有DOM1 同样的事件 DOM0会顶掉html事件   因为他们都是属性  而 ...

  3. JavaScript高级程序设计 读书笔记

    第一章 JavaScript 简介 第二章 Html中使用JavaScript 第三章 基本概念 第四章 变量,作用域,内存 第五章 引用类型 第六章 面向对象 第七章 函数表达式 第八章 BOM 第 ...

  4. Javascript高级程序设计读书笔记(第三章)

    第3章 基本概念 3.4 数据类型 5种简单数据类型:undefined.boolean.number.null.string. typeof操作符,能返回下列某个字符串:“undefined”.“b ...

  5. 《JavaScript高级程序设计》笔记:基本概念(三)

    数据类型 ECMAScript中有5种简单数据类型(也称为基本数据类型):undefined,null,boolean,number和string. typeof typeof null会返回“obj ...

  6. javascript高级程序设计读书笔记

    第2章  在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...

  7. JavaScript高级程序设计-读书笔记(6)

    第20章 JSON JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量 JSON的语法可以表示一下三种类型的值 l        简单值:使用与JavaScript相同的语法,可以在JS ...

  8. JavaScript高级程序设计-读书笔记(1)

    第1章 JavaScript简介 JavaScript是一种专为与网页交互而设计的脚本语言,由下列三个不同的部分组成: l        ECMAScript:提供核心语言功能: l        文 ...

  9. javascript高级程序设计 读书笔记1

    第二章  在HTML中使用JS 加载JS有三种:行内,head头部和外部链接JS   最好使用外部链接<script src="example.js" ></sc ...

  10. Javascript高级程序设计读书笔记(第六章)

    第6章  面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新 ...

随机推荐

  1. MySQL 触发器trigger

    一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(af ...

  2. L2-2 小字辈

    思路 bfs搜一下. 代码 #include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; vector<i ...

  3. logits的用法和此类标注的作用,已经再最后一层加了映射了就不需要再加入了

    logits的用法和此类标注的作用,已经再最后一层加了映射了就不需要再加入了 待办 PyTorch(tensorflow类似)的损失函数中,有一个(类)损失函数名字中带了with_logits. 而这 ...

  4. [MC] 我的世界 craftbukkit-1.12.2 卡爆

    昨天晚上的时候,和朋友玩我的世界 结果我这边卡爆了,牛圈里面的牛都是一动一动的... 然后我登陆服务器,发现CPU爆炸了... 100%的使用率 mstsc都卡爆了 内存占用了800多MB (服务器是 ...

  5. 创建集群corosync

    #环境准备 #设置主机名解析yum -y install pcs pacemaker corosync fence-agents-allsystemctl start pcsd.servicesyst ...

  6. MySql 怎么存取 Emoji

    01.前言 Emoji 在我们生活中真的是越来越常见了,几乎每次发消息的时候不带个 Emoji,总觉得少了点什么,似乎干巴巴的文字已经无法承载我们丰富的感情了.对于我们开发者来说,如何将 Emoji ...

  7. 8.14-T2捕老鼠(cat)

    题目大意 有 N 个仓库,排成了一排,编号为 1-N.假设在第 i 个仓库点燃艾条,烟雾就会充满该仓库,并向左右扩散Ai的距离,接着所有|i-j|<=Ai的仓库 j 的老鼠被消灭.最少需要多少支 ...

  8. vs查看动态库依赖

    dumpbin是VS自带的工具,进入Visual Studio 的命令提示 查看程序或动态库所依赖的动态库 dumpbin /dependents  abc.exe 查看动态库的输出函数 dumpbi ...

  9. 初探日志分析常用的linux命令

    了解linux常用命令,有助于提升我们的生产力,提升工作效率,更快速地定位问题,当然也是为了更好地解决问题.这两天,趁着在家办公的时间,我把linux系统中常用的命令整理了一下,主要涉及到查找.查看, ...

  10. 解决wps for linux缺失windows字体

    操作步骤 1.下载缺失字体 链接: https://pan.baidu.com/s/1ZUbtQ96b8RVbH0LrXb_GlQ  密码: nsr4 2.解压字体 unzip wps-font-sy ...