js基础2

js数据类型

js定义了6种数据类型,数值、字符串、布尔值称为原始数据类型的值即基本数据类型。
将对象称为复杂类型的值,对象又可以细分为狭义的对象、数组、函数、正则表达式。因为一个对象往往是多个原始类型的值的合成,可以看做是一个存放各种值的容器。
至于undefined和null,一般将他们看成两个特殊值。
数值(number):整数和小数
字符串(string):字符组成的文本
布尔值(boolean):true和false
undefined:未定义或不存在,即此处目前没有任何值。
null: 空缺,即此处应该有一个值但目前为空
对象: 各种值组成的集合。
基本数据类型和引用类型的区别:
基本数据类型

  1. 基本数据类型的值是不可变的
var name="hello";
name.substr(2);//此处sunstr方法返回新的字符串
console.log(name);//"hello"
  1. 基本数据类型不可以添加属性和方法
  2. 基本数据类型是简单的赋值
  3. 基本数据类型是值的比较
var a="{}";
var b="{}";
console.log(a==b);//这里是字符串的比较,所以返回的是true。
  1. 基本数据类型存放在栈中,栈里存放的是一个字典,左侧是key(变量名),右侧是value(真正的值)
    引用类型
  2. 值是可以改变的
var o={x:1};
o.x=2;//console.log(o.x)已经变成2了。
  1. 可以添加属性和方法
  2. 引用类型赋值的是对象的引用
var a={};
var b=a;//b在栈中新建了一个地址,指向了a在堆中存储的数据
a.name="change";//a的更改影响b的数值
console.log(a.name);//change
console.log(b.name);//change
  1. 引用类型比较的是引用地址
var a={};
var b={};
console.log(a==b);//这里返回的是false。
  1. 引用类型数据会保存在栈和堆中
    var a={name:"zs"}栈中保存的是a和一个分配的地址,堆中保存的是'{name:"zs"}'

typeof和instanceof的作用和区别

typeof 用以获取一个变量的类型,typeof一般只能返回如下几个结果: number ,boolean ,string, function, object, undefined,我们可以使用typeof来获取一个变量是否存在,如if(typeof a!="undefined"){},而不用去使用if(a)因为如果a 不存在(未声明)就会出错,对于Array,Null等特殊对象使用typeof一律返回object,这正是typeof的局限性。
如果我们希望获取一个对象是否是数组,或判断某个变量是否是某个对象的实例则要选择使用instanceof。instanceof用于判断一个变量是否是某个对象的实例,例如var a=new Array();alert (a instanceof Array);会返回true;同时alert(a instanceof object)也会返回true,这是因为Array是object的子类。再如function test (){};var new test();alert(a instanceof test)会返回true。

判断一个变量是否是数字、字符串、布尔、函数

typeof

typeof返回6种数据类型,但是对于所有的对象都返回object,不能返回自定义的数据类型。比如,date,regexp,array,domelement的类型都是object,另外,typeof null是object。

instanceof

instanceof适用于任何object类型的检查。

function animal(){
  (new animal) instanceof animal //直接原型关系返回true
}
function cat(){}
cat.prototype=new animal
(new cat) instanceof animal // 原型链上的间接原型

instanceof也可以用于检测实例比如 array, regexp,object, function。这一点可以区分数组和对象

[1,2,3]instanceof array //true
/abc/ instanceof RegExp //true
var o={};
var a=[];
o instanceof Array//false,o不是Array的实例   
a instanceof Array//true,instanceof判断是否是数组实例

instanceof 对基本数据类型不起作用,但是可以这样:

new Number(3) instanceof Number // true

但这时你已经知道数据类型了,类型检查已经没有用了。

toString

toString方法是最为可靠的类型检测手段,它会将当前的对象转为字符并输出。toString属性定义在object.prototype上。因而所有的对象都有toString
方法。但array,date等对象会重写object.prototype继承来的toString,所以最好用Object.protoytpe.toString来检测类型。

toString=Object.prototype.toString;
toString.call(3)//[Object Number]

toString适用于ecma的内置js类型(包括基本数据类型和对象)但是不能判断自定义的数据类型。

NaN

即非数值是一个特殊的数值。

parseInt('abc')//NaN

任何数值除以非数值会返回NaN;
任何涉及NaN的操作都会返回NaN;
NaN与任何值都不相等,包括NaN本身。

非数值转化为数值

  1. number()函数,不常用
  2. paseInt()
    转换规律
  • 忽略字符串前面的空白字符,找到第一个非空白字符
  • 如果第一个字符不是-或者数字则返回NaN
  • 如果是,继续解析,直到非数值模式为止
  • 0开头会当做八进制,0X开头会当做十六进制,可以指定第二个参数指定基数parseInt('101' ,2),其中2就是二进制。
  1. paseFloat()
    paseFloat('3.4')//3.4

布尔类型

==与===的区别

==是近似相等,使用==的时候,js会帮助我们做类型的转化然后再比较值,造成一些匪夷所思的结果,那么使用==的时候会在哪些情况下做类型的转换,又会转换成什么样子

  • 如果两个值得类型相同,则执行严格相等的运算。
  • 如果两个值得类型不同:
  1. 如果一个是null,一个是undefined那么相等。
  2. 如果一个是数字,一个是字符串,先将字符串转为数字,然后比较
  3. 如果一个值是true/false,则将其转为1/0比较
  4. 如果一个值是对象,一个是数字或字符串,则尝试使用valueof和toString 转换后比较。
  5. 其他的就不相等了。
    ===是绝对相等:数据类型一样再比较值,用此做判断最严谨。

转换为false的类型

如果js预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值,转换规则是除了下面六个值被转换为false其他值都视为true。undefined,null,false,0,nan,""(不能为空格,空字符串)

if(undefined){console.log('ok')}//undefined   
if(!undefined){console.log('ok')}//ok

空对象和空数组的转换

[]和{}对应的布尔值都是true。

Number

js的数字类型和其他语言有所 不同,没有整型和浮点数的区别,统一都是Number,可以表示十进制、八进制、十六进制。

浮点数

浮点数是指数字包含小数点、小数点后至少有一位数字(没有或是会转换 为整数),前面可以没有。

var a=3.1e5
var b=.45

对于极大或者极小的数字可以使用科学计数法

var a=3.1e5//310000

浮点数最高精度是17位,但在计算的时候精度不如整数所以在做小数运算时不要做判断

1-0.9;//0.099999...8
a=0.1,b=0.2
if(a+b==='0.3'){
  console.log('ok')//undefined
}

整数有最大值、最小值限制,当超过范围后就不精确了。
Infinity表示无穷大,也是number类型。1/0。

string

可以用单引号或者双引号表示。

object

对象就是一种无序的数据集合,由若干个 ‘键值对’(key-value)构成,key我们通常称为对象的属性,value可以是任何js类型,甚至可以是对象。

属性的读取

object的属性读取有两种方式
obj.name
obj['name']

null和undefined

null和undefined都可以表示“没有”,含义非常相似,将一个变量赋值为‘undefined’和null的效果非常相似。

var a=undefined//直接写var hello打印hello就会出现undefined  
var a=null//但是对于null必须赋值为null,var world=null,打印world 

在if语句中,它们都会被自动转换为false,相等运算符(‘==’)甚至报告两者相等。

if(!undefind){
  console.log('undefined is false')
}
if(!null){
  console.log('null is false')
}
undefined==null//true
Number(null)//0
Number(undefined)//NaN

null表示空值:var a=null(声明变量为空)
用法:作为函数的参数,表示该函数的参数是一个没有任何内容的对象。
undefined:表示不存在值,就是此处目前不存在任何值。
用法:变量被声明了,但没有赋值时,等于undefined.调用函数时,应该提供的参数没有提供,该参数等于undefined,对象没有赋值的属性,该属性的值为undefined,函数没有返回值时,默认返回undefined.

var i//undefined 没有赋值  
function f(x){
  console.log(x)//f();undefined 没有return 
}
var o=new object()
o.p//undefined 声明对象,调用对象属性。
var x=f();//x undefined
#break与continue的区别
break是退出循环,而continue是跳过本次循环执行下次循环

for(var i=1;i<10;i++){
if(i%4===0){
break;
}
console.log(i);
}
i:1/2/3
for(var i=1;i<10;i++){
if(i%4===0){
break;
}
console.log(i);
}i:1/2/3/5/6/7/9

#void 0与undefined的区别
viod作用是执行一个表达式,返回undefined
例如:

function fn(){
var undefined=3;
var a;
if(a===undefined){
console.log("===")
}else{
console.log("!==")
}
}
fn()

上述做法是错误的当把undefined赋值了,就不能做判断了,方法就是a===void 0
#代码
1. console.log(1+1)输出结果是2
原因:两个操作数是数字,会做加法运算。
console.log("2"+"4")输出结果是“24“
原因:两个参数是字符串,会做字符串拼接
console.log(2+"4")输出结果是”24“
原因: 有一个参数是字符串,会做字符串拼接
console.log(+"4")输出结果是4
原因: 在只有一个字符串参数的时候,会尝试将其转换成数字
2.

var a=1;
a+++a;//输出结果是3,理解为(a++)+a,因为++的优先级高于+,所以等同于1+2=3。
typeof a+2//输出结果是“number2”typeof的优先级高于+,所以typeof a是number字符串,字符串与数字相加为拼接字符串。

3. 

var a=1;
var b=3;
console.log(a+++b);//输出结果是4,++的优先级较高,所以先运算,等同于(a++)+b=1+3=4

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

var arr=[3,4,5]
for(i=0;i<arr.length;i++){
console.log(arr[i]*arr[i]);
}

5. 遍历json,打印里面的值

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

6. 

var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val) //输出结果是“number2”因为typeof的权重高,typeofa输出是number,字符串与数字相加是字符串拼接。
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)//输出结果是bb和undefined;先运算console.log('bb')输出bb,然后进行判断d==5(true),console.log('bb')无法转换成布尔值,所以输出undefined。
var data2 = d = 0 || console.log('haha')
console.log(data2)//输出结果是haha和undefined;先运算console.log('haha')输出haha,然后进行“||”,因为0的布尔值是false,console.log('haha')无法转换成布尔值,最后data2的值为undefined。
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)//输出结果是2。!!"Hello"的结果为true,(!"world", !!"from here!!") 逗号运算符用于对两个表达式求值,并返回后一个表达式的值,!!"from here!!"的结果为true,因此(!"world", !!"from here!!")返回true,所以var x = true + true。当数字和布尔值或布尔值与布尔值进行+、-、*、/操作时,会将布尔值转换为数字,true转换为1,false转换为0。所以var x = true + true转换为var x = 1 + 1,因此最终结果为2








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

推荐阅读更多精彩内容