《JavaScript高级程序设计》读书笔记(三)基本概念第四小节 操作符

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


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


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

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

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


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

1 +"0.1"; //0.1
2 -"0.1"; //-0.1
3 +"z"; //NaN
4 var o = {
5     valueOf:function() {
6         return 2;
7     }
8 }
9 +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
--在赋值中,逗号操作符总会返回表达式中最后一项的值

转载于:https://www.cnblogs.com/loveluking/p/9430839.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-table数据不显示_数据透视表,一篇就够了

| 函数部分告一段落&#xff0c;这一篇文章助你学懂数据透视表目录&#xff1a;一、创建数据透视表二、数据透视表字段列表值的显示方式三、分析1、切片器2、计算字段3、计算项4、组合四、设计1、分类汇总2、报表布局首先&#xff0c;我们要知道应用数据透视表的前提&#xff1…

app vue 真机运行_使用 HBuilder 将 Vue 项目打包成手机 App

在开发移动端 app 时可以选择原生 app 和 webapp&#xff0c; 原生 app 体验好&#xff0c;开发成本高&#xff0c;相对的 webapp 体验要差&#xff0c;开发成本低。webapp 要求很低&#xff0c;可以说只要会开发web 站就能开发 webapp&#xff0c;这里不讨论怎么选择&#xff…

AlvinZH双掉坑里了

AlvinZH双掉坑里了 时间限制: 1000 ms 内存限制: 65536 kb题目描述 AlvinZH双掉进坑里了&#xff01; 幸运的是&#xff0c;这坑竟然是宝藏迷宫的入口。这一次AlvinZH机智地带了很多很多背包——装金币&#xff01; 假设现在AlvinZH捡到了n块金币&#xff0c;他一共带了m个背包…

解决安卓字体偏移:页面整体缩放

在h5中实现一些小标签、按钮的时候&#xff0c;很容易发现部分安卓机型上的字体显示有问题&#xff0c;总会向上偏移2px左右。这是设置padding或line-height无法修复的&#xff0c;与rem也无关&#xff0c;即使在字体大于12px时依然存在。下图来自于网友的分享&#xff0c;从左…

bmp调色板颜色信息重复_如何更改 Linux 终端颜色主题 | Linux 中国

你可以用丰富的选项来定义你的终端主题。-- Seth Kenlon如果你大部分时间都盯着终端&#xff0c;那么你很自然地希望它看起来能赏心悦目。美与不美&#xff0c;全在观者&#xff0c;自 CRT 串口控制台以来&#xff0c;终端已经经历了很多变迁。因此&#xff0c;你的软件终端窗口…

CH Round #46A 磁力块

还是一道好题的 对于一个磁石是否被吸引&#xff0c;有两个关键字&#xff1a;距离和质量。&#xff08;二维偏序&#xff1f;&#xff1f;&#xff09; 好像是很厉害的分块姿势&#xff0c;先按第一关键字排序&#xff0c;在块中按第二关键字排 进行bfs&#xff0c;对于当前磁…

CSS颜色代码

CSS颜色代码大全 FFFFFF#DDDDDD#AAAAAA#888888#666666#444444#000000#FFB7DD#FF88C2#FF44AA #FF0088 #C10066 #A20055 #8C0044 #FFCCCC#FF8888#FF3333 #FF0000 #CC0000 #AA0000 #880000 #FFC8B4#FFA488#FF7744 #FF5511 #E63F00 #C63300 #A42D00 #FFDDAA#FFBB66#FFAA33#FF8800 #…

js判断是否在iframe中

以下都可以判断代码是否在iframe中. 1.方式一 if (self.frameElement && self.frameElement.tagName "IFRAME") {   alert(在iframe中); } 2.方式二if (window.frames.length ! parent.frames.length) {   alert(在iframe中); } 3.方式三if (self ! top…

Java:逐步读取/流式传输CSV文件

我一直在做一些涉及读取CSV文件的工作&#xff0c;而我一直在使用OpenCSV &#xff0c;而我的最初方法是逐行读取文件&#xff0c;解析内容并将其保存到地图列表中。 当文件的内容适合内存时&#xff0c;此方法有效&#xff0c;但对于较大的文件来说是个问题&#xff0c;在这种…

mac 配置java adb环境_MAC 配置android adb命令的环境变量

1,打开终端&#xff0c;敲入命令&#xff1a;sudo vi .bash_profile (如果有密码就为本机登录密码)(如果没有这个文件就会创建一个新的)默认终端目录如图&#xff0c;生成的文件为隐藏文件&#xff1a;(显示隐藏文件命令&#xff1a;defaults write com.apple.finder AppleSho…

mac懒人版_这些实用的Mac软件你迟早会用到,建议收藏!

日常使用mac&#xff0c;遇到不同的问题可以通过不同的应用进行来进行处理&#xff0c;所以称手的工具是必不可少的。然而这些问题也会引导我们去发现更多实用优秀的软件&#xff0c;今天macdown就把自己在使用Mac过程中遇到的一些实用的Mac软件推荐给大家&#xff0c;相信你迟…

第一节 理解单元测试

在查看代码之前&#xff0c;最好提一下编写单元测试和使用单元测试的一些基本信息和规则。 记住这些基本规则并理解单元测试的重点非常重要。 单元测试不仅仅是一个很好的功能&#xff0c;而且是任何正规软件项目中绝对必要的部分。 1.什么是单元测试 一个简单的问题&#xff0…

Metro风格的Java组合框(JMetro)–重新介绍

我上一篇有关JMetro的文章–我的都市风格的Java外观&#xff08;或外观&#xff09;是关于日历选择器控件的外观 。 我本打算使用Tom Eugelink不错的日历选择器&#xff0c;但是当时我了解到它是由Oracle创建并随Java 8一起交付的&#xff0c;因此出于时间的考虑&#xff08;几…

弹性盒模型--新版与旧版比较(2)

弹性空间与元素具体位置设置是加在子元素身上的 <style> body{   margin: 0; } #box{   height: 300px;   border: 1px solid #000;   新版弹性盒模型   /*display: flex;*/ 老版弹性盒模型   display: -webkit-box; } #box div{   /*新版*/   /*flex-g…

KNNClassifier

import numpy as npfrom math import sqrtfrom collections import Counterfrom .metrics import accuracy_scoreclass KNNClassifier: def __init__(self, k): """初始化kNN分类器""" assert k > 1, "k must be valid…

左斜杠和右斜杠有什么区别_「斜杠云」SEO推广和SEO优化有什么区别?

1&#xff0c;首先&#xff0c;从概念上来说&#xff0c;网络推广就是企业从开始申请域名、租用空间、网站备-案、建立网站、直到网站正式上线开始就算是介入了网络推广活动&#xff0c;而通常我们所指的网络推广是指通过互联网的种种手段&#xff0c;进行的宣传推广等活动&…

python算两个时间之间的天数,将天数转成int型

import time import datetime#计算两个日期相差天数&#xff0c;自定义函数名&#xff0c;和两个日期的变量名。 def Caltime(date1,date2):#%Y-%m-%d为日期格式&#xff0c;其中的-可以用其他代替或者不写&#xff0c;但是要统一&#xff0c;同理后面的时分秒也一样&#xff1…

并发编程-concurrent指南-阻塞队列BlockingQueue

阻塞队列BlockingQueue&#xff0c;java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列。 适用场景&#xff1a; BlockingQueue通常用于一个线程生产对象&#xff0c;而另一个线程消费对象的场景。 一个线程往里面放&#xff0c;另一个线程从里面取的…

博主自制丨免费下载丨免费使用丨仅用于测试

链接&#xff1a;点我立即下载 提取码&#xff1a;0j6h

使用JSTL视图探索Spring Controller

让我们通过对Spring MVC的Controller开发的更多探索来改进以前的Spring JDBC应用程序 。 我将展示另一种编写新的Controller的练习&#xff0c;该Controller处理HTML表单并在JSP视图页面中使用JSTL标签。 要在Spring MVC应用程序中启用JSTL&#xff0c;您需要将以下内容添加到…