js数据类型

数据类型

  • 字符串对象和字符串

    • 字符串可隐式转化为字符串对象

      var a=new String('a');
      var b=new String('a');
      a==b;    //false,引用不同
      a===b;    //false,引用不同
      a=='a';    //true,内部转换
      a==='a';//false,值相同,类型不同
      String('a')==='a';//true,显式转换为字符串
      
    • 是不可变的,其方法是非破坏性的,不能改写其内容。

      var a='abc';
      a[0]='A';
      console.log(a);//结果仍是'abc';
      
  • 数值型

    • 内部使用浮点数运算

      0.1+0.2 !== 0.3;
      NaN不与任何值相等,判定用 isNaN()
      正常数字(除NaN与正负无穷大)判定用isFinite()
      
  • null 是字面量,代表没有引用任何对象,是object但是没有对应的类
  • undefined 是预定义全局变量
  • object
  • boolean

    • object类型都是true

      var b=new Boolean(false);
      !!b;//object对象,true
      var b=Boolean(false);
      !!b;//函数内建类型,false;
      
  • array

    • 数组赋值是引用赋值,修改被赋值数组也会破坏原数组
    • 要实现非破坏数组,用concat

      //浅复制,若遇到数组中有引用部分也会被破坏
      var arr=[3,4,5];
      var arr2=[].concat(arr); 
      
      //遍历
      var p=console.log;
      var a=new Array(1,2,3,4,5);
      p(Object.keys(a),Object.getOwnPropertyNames(a));
      
    • 删除用delete会留下空隙,用splice(index,num)删除更合适

语句&表达式

  • switch中case比较是用 === 判定的
  • do-while

    //从右向左打印数字
    function printFromRight(n){
      do{
        console.log(~~n%10);
        n=~~(n/10);//数字取整
      }while(n>0);
    }
    
  • try-catch

    var p=console.log;
    try{
      p('start');
      null.x;
      p('here');
    }catch(e){//只会有一个catch捕获
      p('info: ['+e+']')
    }finally{
      p('end');
    }
    
  • for vs for each

    for...in遍历对象的属性名和值
    for each只能遍历属性值
    

变量&对象

  • 对象和变量的赋值运算,是将对象的引用复制给变量
  • 函数的的参数是对其引用的赋值,实际是值得传递,并不会更改其引用所指向的对象

    var p=console.log;
    function no_swap(a,b){
        a^=b;
        b^=a;
        a^=b;
    }
    var a=6,b=8;
    no_swap(a,b);
    p(a,b);//6,8并不改变原对象值
    
    //利用返回值赋值改变
    function swap(a,b){
      return [b,a];
    }
    
    [a,b]=swap(a,b);
    p(a,b);
    
  • 通过原型链继承的属性无法delete

    function MyClass(){}
    MyClass.prototype.x=5;
    var obj=new MyClass();
    delete obj.x;//返回true但删除失败
    p(obj.x);
    
  • 实现不可变对象

    preventExtensions    ---    不可新增属性
    seal                ---    不可新增,删除属性
    freeze                ---    不可新增、删除、变更属性
    

JSON

var p=console.log;
//字符串转对象
var s='{"x":1,"y":2,"z":3}';
var obj1=eval('['+s+']');
var obj2=JSON.parse(s);
//对象转字符串
var str2=JSON.stringify(obj);
如有疑问,请留言或邮件newbvirgil@gmail.com
本文链接 : http://blog.newbmiao.com/2015/02/28/js-data-structure.html