js基础2

作者: 倾国倾城的小饼干 | 来源:发表于2017-08-26 08:58 被阅读0次

    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

    
    
    
    
    
    
    
    

    相关文章

      网友评论

          本文标题:js基础2

          本文链接:https://www.haomeiwen.com/subject/ehnydxtx.html