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

操作符
--操作数据值的操作符
--算术(如加减)、位操作符、关系、相等
--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. 正则表达式过滤url请求

    过滤url中带reset的url请求 atgBusSignFilter.setSignUriRegex("^.*/reset/.*$")等价于 atgBusSignFilter.s ...

  2. python面试的100题(3)

    3.输入日期, 判断这一天是这一年的第几天? import datetime def dayofyear(): year = input("请输入年份: ") month = in ...

  3. 解决Macbook Pro蓝牙不可用问题

    谷歌搜索了下,在威锋网看到一个帖子,需要关机重置电源管理单元和系统NVRAM恢复出厂设置,具体操作如下:1.关机2.同时按下shift+control+option+power,保持5秒左右3.先按下 ...

  4. IIR filter design from analog filter

    Analog filter和digital filter的联系: z变换与Laplace从数学上的关系为: 但这种关系在实际应用上不好实现,因此通常使用biliner transform(https: ...

  5. (c#)删除最外层的括号

    题目 解

  6. 每天进步一点点------Xilinx FPGA开发工具 EDK SDK术语

    XPS:Xilinx Platform Studio,平台工作室.用于嵌入式处理器硬件部分的开发. SDK:Software Development Kit,软件开发套件.基于Eclipse平台,支持 ...

  7. form:select的内容

    https://blog.csdn.net/ccclych1/article/details/88395650

  8. ios 下 select和option 无法隐藏指定元素

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 揭秘jQuery-选择器

    先看代码: $(“li”)只选择第一个无序列表中的一个li元素,而不会选择另一个无序列表中的li元素 <!DOCTYPE html> <html> <head> & ...

  10. opencv:边缘保留滤波

    EPF滤波概述 均值与滤波的缺点:并没有考虑中心像素点对整个输出像素的贡献,实际上锚定的那个点贡献应该是最大的 高斯滤波的缺点:当边缘值梯度很大的时候,应减少中心像素点的权重,而高斯滤波没有考虑 边缘 ...