Javascript 数据类型与基本运算

标识符命名规则

对于变量名,键值对中的键名应满足如下要求:

  • 开头必须是字母、下划线(_)或美元符号($)
  • 除了开头以外的字符也可以是数字
  • 不可以是关键字和保留字
  • 最好不要和全局变量/函数同名,会把原有变量/函数覆盖的风险

这里,关键字就是在 js 中有特殊意义的单词,而保留字是为了以后使用预留的词语。但不要求背它们,随着学习的深入,自然就都记住了。

常见的关键字有:

break、delete、function、return、typeof、case、do、if、switch、var、catch、else、in、this、void、continue、false、instanceof、throw、while、debugger、finally、new、true、const、with、let、default、for、null、try、async 等等

常见的保留字有:

class、enum、export、extends、import 、super等等

本文可能会直接用到的有:

  • var: 定义一个变量
  • console.log(): 在浏览器控制台或后台终端输出一个值
  • alert(): 在浏览器弹窗输出一个值

基本数据类型

Javascript 基本类型包括:数值,字符串,null,undefined 和布尔型。还有 ES6 中的 Symbol 类型,这篇博客暂时先不提 Symbol 类型。

比如:

var num = 1;    //数值型
var str = 'hello world;   //字符串,双引号也可以
var flag = true;   //布尔型,取值 true 或 false
var obj = null;    //空类型
var it = undefined;   //undefined

这里简单解释一下需要注意问题:

  1. 数值类型是不区分整型与浮点型的;
  2. 数值类型默认都是以 double 浮点数形式储存的;
  3. 数值类型范围在 5e-324 至1.7976931348623157e+308,即 `Number.MIN_VALUE 至 Number.MAX_VALUE;
  4. js 没有字符类型,只有字符串类型;
  5. null 表示正常的、意料之中的空值,而 undefined 表示以外的空值。对于只声明未赋值的变量,默认值为 undefined;
  6. 数值类型有几个特殊值:
  • Infinity: 正无穷
  • -Infinity:负无穷
  • NaN:非法数值(Not a Number),但他还是个数值(好矛盾)

复杂数据类型

基本数据类型对应的对象

js 中其实除了基本类型以外其他类型的本质都是对象,就算是基本类型变量,除了 undefined 和 null 以外,都有其对应的对象类型。如下:

var num = new Number(2);
var str = new String('hello');
var flag = new Boolean(true);

这里一定要清楚,其对象类型和基本类型不是一个东西,具体的看完类型转换就一切都清楚了。

js中其他常见的对象

当然,下面继续说对象,js 常用的对象有:Array,Object,Date,RegExp等等。定义方法如下:

var arr = new Array();   //得到一个空数组
var arr2 = new Array(5);   //得到一个长度为5的数组,初值为undefined
var arr3 = new Array('b','a','c');    //得到一个长为3,对应值为'b','a','c' 的数组
var obj = new Object();   //得到一个空对象
var now = new Date();    //得到当前时间
var reg = RegExp('^[A-Za-z][\w\d]*$');   //得到一个正则表达式

对于数组、正则表达式和对象还有一种字面量的定义方法,这个方法和上面是完全等价的:

var arr = [];   //得到一个空数组
var arr3 = ['b','a','c'];    //得到一个长为3,对应值为'b','a','c' 的数组
var obj = {};   //得到一个空对象
var reg = /^[A-Za-z][\w\d]*$/;  //得到一个正则表达式

数组和对象的访问

这个部分直接举例子:

  • 数组:一些数据的集合,这里不要求数据必须是同样类型的
var arr = [1, 2, 3, 'a'];    //定义一个数组
arr[0];     //1     访问数组的第1个元素,注意索引从0开始
arr[1];     //2     访问数组的第2个元素
arr[3];     //'a'    访问数组的第4个元素
arr[-1],  arr[4],  arr[1.3];    //undefined   访问数组越界或索引不正确都返回 undefined
  • 对象: 键值对的集合,键值对之间由逗号分开,键和值由冒号分开
var obj = {
    name: 'Bob',
    age: 18,
    gender: 'M'
};
obj.name;    //'Bob'  获取 obj 对象的姓名
obj.age;    //18  获取 obj 对象的年龄
obj.gender;    //'M'  获取 obj 对象的性别

注意当键名中有符号也需要加引号。

其余的对象会在以后用到的时候再仔细讲

基本运算和运算符

运算符就像我们数学中的加减乘除,也像数学中的计算规定的先后顺序,这里我直接给出所以运算符的运算顺序和实例,必要的解释在表格后面,没有解释到的属于比较深奥的运算符,记住它的顺序即可,功能后续再理解。

优先级 运算符 结合性 举例 说明
20 圆括号 n/a (…) -
19 成员访问 从左到右 obj.name -
19 需计算的成员访问 从左到右 obj["name"] -
19 new(带参数列表) n/a new Person() -
18 函数调用 从左到右 fun(args) -
18 new(无参数列表) 从右到左 new fun -
17 后置递增 n/a a++ 相当于 a = a + 1;
17 后置递减 n/a a-- 相当于 a = a - 1;
16 逻辑非 从右到左 !a -
16 按位非 从右到左 ~a -
16 一元加法 从右到左 +a -
16 一元减法 从右到左 -a -
16 前置递增 从右到左 ++a -
16 前置递减 从右到左 --a -
16 typeof 从右到左 typeof 4 得到值的类型 'number'
16 void 从右到左 void(0) 执行表达式并返回 undefined
16 delete 从右到左 deleteobj.age 删除对象属性
15 从右到左 2**4 得 16
14 乘法 从左到右 2*3 得 6
14 除法 从左到右 4/2 得 2
14 取模(求余) 从左到右 4%3 得 1
13 加法 从左到右 1+3 得 4
13 减法 从左到右 2-3 得 -1
12 按位左移 从左到右 32<<5 得 1024
12 按位右移 从左到右 32>>2 得 -8
12 无符号右移 从左到右 -32>>>2 得 1073741816
11 小于 从左到右 -1 < 2 得 true
11 小于等于 从左到右 -1 <= 2 得 true
11 大于等于 从左到右 -1 >= 2 得 false
11 大于 从左到右 -1 > 2 得 false
11 in 从左到右 "name" in obj -
11 instanceof 从左到右 li instanceof HTMLElement -
10 等号 从左到右 5 == '5' 得 true
10 非等号 从左到右 5 != '5' 得 false
10 全等号 从左到右 5 === '5' 得 false
10 非全等号 从左到右 5 !== '5' 得 true
9 按位与 从左到右 10 & 40 得 8
8 按位异或 从左到右 10 ^ 40 得 34
7 按位或 从左到右 10 40 得 42
6 逻辑与 从左到右 0 && 3 得 0,不得 false
5 逻辑或 从左到右 0 3 得 3,不得 true
4 ?: 从右到左 8 !=0 ? 1 : 3 得 1
3 赋值 从右到左 a = 2 -
3 += 从右到左 a += 2 相当于 a = a + 2
3 -= 从右到左 a -= 2 相当于 a = a - 2
3 *= 从右到左 a *= 2 相当于 a = a * 2
3 /= 从右到左 a /= 2 相当于 a = a / 2
3 &= 从右到左 a &= 2 相当于 a = a & 2
3 = 从右到左 a = 2 相当于 a = a 2
3 ^= 从右到左 a ^= 2 相当于 a = a ^ 2
3 %= 从右到左 a %= 2 相当于 a = a % 2
3 <<= 从右到左 a <<= 2 相当于 a = a << 2
3 >>= 从右到左 a >>= 2 相当于 a = a >> 2
3 >>>= 从右到左 a >>>= 2 相当于 a = a >>> 2
2 yield 从右到左 yield returnValue; -
2 yield* 从右到左 yield* returnValue; -
1 展开运算符 n/a arr1.push(...arr2) -
0 逗号 从左到右 a=1,b=2 返回最后一个表达式的值 2

需要说明的是:

  1. 优先级越高的优先计算,同优先级的从左到右依次计算;
  2. a++ 与 ++a 的区别: 前者先返回值后自加,后者先自加再返回值(a-- 与 --a 同理);
  3. 涉及到位运算的部分不是十分重要,但以后的文章会细谈;
  4. == 和 === 的区别,前者比较是发生自动类型转换,后者不发生自动类型转换(!= 与 !== 同理);
  5. 对于 exp ? val1 : val2; 如果 exp 的结果为 true,整个表达式得 val1, 否则得 val2;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容