JS基础

JavaScript 的数据类型

  • 数值(number):整数和小数(例如1和3.14)
  • 字符串(string):字符组成的文本(比如"Hello World"
  • 布尔值(boolean):true(真)和 false(假)两个特定值
  • undefined:表示“未定义”或不存在,即此处目前没有任何值
  • null:表示空缺,即此处应该有一个值,但目前为空
  • 对象(object):各种值组成的集合
  • Symbol:ES6引入的,一种类似于字符串的原始类型的值,由Symbol函数生成,每一个值都是独一无二的

原始类型和复杂类型(对象类型)

原始类型 复杂类型
数值、字符串、布尔值、Symbol 对象

JavaScript中有两个特殊的原始值(不可更改:任何方法都无法更改、突变一个原始值),他们不是数字、字符串和布尔值,通常分别代表各自特殊类型的唯一成员

区别:原始类型是最基本的数据类型,不可细分、更改;复杂类型通常是包含了对个原始类型的值的集合(容器)

犀牛书P33 对象类型(即复杂类型)可依据类划分为子类型:数组、函数、日期、正则、错误

typeof 和 instanceof

  • typeof:检测操作数类型,返回值类型为字符串(any -> str)
  • instanceof:测试对象类,返回值类型为布尔值(obj,func -> str)

上述二者都能让我们知道一个值的数据类型,但不同的是,typeof可以准确的返回原始值、函数、undefined的类型,对于其他对象类型的值,只会单一的返回 "object",无法精准判断;而 instanceof 专门针对对象类型的值,a instanceof A,当a的类是A时(即a是A的实例),则返回true,否则返回false,详见犀牛书P78

判断变量类型

  var a = 1,
        b = 'nihao',
        c = true,
        d = function(){return 1;};
  typeof a; // "number"
  typeof b; // "string"
  typeof c; // "boolean"
  typeof d; // "function"

NaN

NaN:非数字值,它和任何值都不相等,包括自身。可以通过 x != x 来判断,当且仅当 x 为 NaN 时,返回 true,ES6中 Number 对象上新提供的 Number.isNaN() 也可检查一个值是否为 NaN

个人理解:非数字值在JS的归类中划入数字,只是这个值无法用数字表示,例如在类型转换中,undefined"one"(非空,非数字)、['a'](其他数组)、function(){}`(任意函数),转换为数字时,结果都为 NaN,因为没办法找到一个数字来表示上述几种值,对象转换为数字的结果较为特殊,参考犀牛书P52

非数值转换为数值

  // 显式转换
  Number()
  parseInt() // 注意参数个数
  parseFloat()
  // 隐式转换
  +x // 加号有两个作用,作为数值运算符,转换为数字(优先级最大);作为加法运算符,相加(优先级次之)参考犀牛书P66 运算符列表
  - -x // 有点多此一举,注意空格

=====

=== 严格相等运算符

  • 如果两值类型不同,则不相等
  • 如果两个值都是 null 或者都是 undefined,则不相等
  • 如果两个值都是布尔值 true 或者都是布尔值 false,则相等
  • 如果其中一个值是 NaN,或者两个值都是 NaN,则不相等
  • 如果两个值为数字且数值相等,则相等。如果一个值为0,另一个为-0,也相等
  • 如果两个值为字符串,且所含的对应位上的16位数(犀牛书3.2节)完全相等,则他们相等。如果他们的长度或内容不同,则不等
  • 如果两个引用值指向同一个对象、数组或函数,则他们相等。如果指向不同的对象,则不等,即使两个对象具有完全一样的属性

== 相等运算符

  • 如果两个操作数类型相同,则参照上述全等运算的规则
  • 如果两个操作数类型不同,应在转换类型之后再做比较
    • 如果一个为 null,另一个为 undefined,相等
    • 如果一个是数字,另一个是字符串,先将字符串转为数字,再比较
    • 如果其中一个值是true,则将其转换为1再进行比较。如果其中一个值是false,则将其转换为0再进行比较
    • 如果一个值是对象,另一个值是数字或字符串,参照犀牛书3.8.3节,用valueOf和toString转换后再比较
    • 其他不同类型之间的比较均不相等

break和continue

  • break 用于强制退出循环体,执行循环后面的语句
  • continue 用于退出本次循环,执行下次循环

void 0 和 undefined在使用场景上有什么区别

  • undefined 并不是保留词,只是全局对象的一个属性,在低版本的IE中能被重写,在ES5中,其只是全局对象的一个只读属性,但在局部作用域中仍然可以被重写
      (function(){
        var undefined = 10;
        // 10 -- chrome
        alert(undefined);
      })();
      (function(){
        undefined = 10;
        // undefined -- chrome
        alert(undefined);
      })();
    
  • void 运算符能对给定的表达式进行求值,然后返回 undefined。也就是说,void无论跟何种表达式,返回的都是 undefined。而最简便的就是 void 0。压缩代码时,常常用void 0代替undefined,因为void 是不能被重写的。

示例

console.log(1+1); // -> 2
console.log("2"+"4"); // -> "24"
console.log(2+"4"); // ->"24"   拓展 num->str时,常用 num+""
console.log(+"4"); // -> 4   此时加号作为数值运算符
var a = 1;
a+++a;
typeof a+2;
// 解析
/*
a+++a  ->  (a++)+a,a++为后增量,a的值自增1,但返回自增前到值,即a++,返回1,a为2
而typeof运算符优先级最高,要高于加法运算符,所以应理解为
*/
var a = 1;
a+++a; // (a++)+a; --> 1+2 --> 3  此时 a 为2
typeof a+2; // --> (typeof a)+2 --> (type 2)+2 --> "number"+2 --> "number2"
var a = 1;
var b = 3;
console.log( a+++b );
/*
同上,后增量   a+++b --> (a++)+b --> 1+3 --> 4
结果为4
拓展,++a+b
++a为前增量,a自增1,并且把自增后的值返回,
如果题目改成 console.log( ++a+b ),就相当于
(++a)+b --> 2+3 --> 5,结果便是5
*/

遍历数组,打印数组每一项的平方

var arr = [3, 4, 5];
var result = arr.map(function(x){console.log(x*x);});

遍历JSON,打印里面的值

var obj = {
  name: 'hunger',
  sex: 'male',
  age: 28
};
for( var i in obj){
  console.log("" + i + ":"+obj[i]);
}

选做

var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0;
console.log(val) ;
// 结果为 "number2"
// var val = ((typeof a)+b) || (c>0);
// var val = "number2" || true;
// 返回 "number2"

或运算符,会首先计算第一个操作数的值,也就是会先计算左侧的表达式,如果结果为真值,那么返回这个真值。否则,再计算第二个操作数的值,即计算右侧的表达式,并返回这个表达式的计算结果

假值:undefined、null、0、-0、NaN、"" //空字符串,以上包括false都称为“假值”,在转换为布尔值时转为false,所有其他值,包括所有对象(数组)都会转换为true


var d = 5;
var data = d ==5 && console.log('bb');
console.log(data);
// 结果为 undefined
// 解析
// var data =((d == 5) && (console.log('bb')))
// var data =(true && (console.log('bb')))
// console.log('bb')  打印出字符串 'bb'  返回 undefined
// var data =(true && undefined)
// var data = undefined;

对与运算符(&&)应有三重理解

  1. 当操作数都是布尔值的时候,“&&” 对两个值执行布尔与(AND)操作,只有在第一个操作数和第二个操作数都为true时,返回true。如果其中一个为false,返回false
  2. “&&” 可以对真值和假值进行布尔与(AND)操作。如果两个操作数都是真值,那么返回一个真值;否则,至少一个操作数是假值的话,则返回一个假值
  3. 若左操作数为假值,只返回左操作数,不对右操作数进行计算;若左操作数为真值时,“&&” 运算符将计算右操作数并将其返回作为整个表达式的计算结果,
    一言以蔽之,“左假返左,左真返右”

var data2 = d = 0 || console.log('haha');
console.log(data2);
// 或运算理解,左操作数为假值,右操作数为假值(console.log()返回 undefined),返回右操作数结果,即返回 undefined
// 因此只需返回右操作数,所以结果为 undefined

var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x);
// 解析
// !!"Hello" -> true
// !"world" -> false
// !!"from here!!" -> true
// 逗号运算符是二元运算符,先计算左操作数,再计算右操作数,最后返回右操作数的值
// (!"world",!!"from here!!") -> (false,true) -> true
// !!"Hello" + true -> true + true -> 1+1 -> 2
// 此处的加号会让操作数先转换为数字,再进行计算,
// 所以结果为 2

“!” 运算符首先将其操作数转换为布尔值,然后再对布尔值求反。即 “!” 总是返回 true 或 false,并且,可以通过两侧逻辑非运算来得到一个值的等价布尔值:!!x

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容