js小题目(持续更新)Javascript学习笔记一 之 数据类型。

连日感觉之前做过的问题非常老没接触的言语就是见面忘记,于是打算专门起一个记下小问题之随笔当题典用。

一.数据类型 Javascript是同样栽弱类型的脚本语言,它一起发6种植多少列,又于分成基础数据类型,特殊数据类型,复合数据类型。
   1.基础数据类型:数值型,字符串型,布尔型
   2.奇异数据类型:null,undefined(区别在于null需要显性赋值,而undefined表示从未赋值)
   3.复合(引用)数据类型:Object(数组是破例的对象)

目录

五种关键数据列进行价值复制
数组去重新
数组去重新并计数


流动:理解基础数据类型和援数据类型的区分。如函数参数传递

贯彻clone()方法,对五栽关键数据类进行价值复制

Object、Array、Boolean、Number、String

分成三种情况:普通变量,Array,Object

因为array和object里吗可能含引用类型,所以递归调用

function clone(obj){
    var copy;
    if(obj instanceof Array){
        copy=[];//用空数组来一个一个接收数据
        obj.forEach(function(value,index){
            copy[index] = clone(obj[index]);
        })
        return copy;
    }else if(obj instanceof Object){
        copy = {};//用空对象来一个一个接收数据
        for(var i in obj){
            copy[i]=clone(obj[i]);
        }
        return copy;
    }else{//值类型直接赋值
        return obj;
    }
}

二. 包装类以及底蕴数据类型的涉 对于基础数据类型,都有对应的包装类(Object对象)与的相应。
Number,String,Boolean

数组去重新

Array.prototype.delRepeat = function() {
    var res = [];//创建一个新的数组存放结果
    var json = {};//创建一个空对象
    for(var i = 0; i < this.length; i++) {//每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复
        if(!json[this[i]]) {
        res.push(this[i]);
        json[this[i]] = 1;
        }
    }
    return res;
}

var arr = [12, 13, 3, 'haha', 13, 12, 4, 'haha', 'hi', 'hihi'];
alert(arr.delRepeat());

而是这样产生个大非常之题材,就是字符串 ‘123’ 和 数值123
会受看成相同元素被超越了。

于是乎可以开如下的改动:

Array.prototype.delRepeat = function() {
    var res = [];//创建一个新的数组存放结果
    var json = {};//创建一个空对象
    var strFlag = '';//判断是否为字符串的标记
    for(var i = 0; i < this.length; i++) {//每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复
        if(typeof this[i] == 'string' ) {  
            strFlag = 'str_';  
        } else {  
            strFlag = '';  
        } 
        if(!json[strFlag+this[i]]) {
        res.push(this[i]);
        json[strFlag+this[i]] = 1;
        }
    }
    return res;
}

var arr = [12, 13, 3, 'haha', 13, '12', 4, 'haha', 'hi', 'hihi'];
alert(arr.delRepeat());

横流:基础数据类型会以得标准下转化成为基础项目包装对象

数组去又并计数

统计数组["番茄炒蛋","泡椒牛柳","香干肉丝","番茄炒蛋","香干肉丝","蜜汁鸡腿"]受到逐条菜之个数。

function test(arr) {
    var hash = {};
    var str = arr.toString();
    str.replace(/[\u4E00-\u9FA5\uF900-\uFA2D]+/g, function($1) {//正则是匹配中文(包括了中日韩文)
    if($1 in hash)
        hash[$1]++;
    else
        hash[$1] = 1;
    });
    return hash;
}
var arr = ["番茄炒蛋","泡椒牛柳","香干肉丝","番茄炒蛋","香干肉丝","蜜汁鸡腿"];
console.log(test(arr));

切实的相当汉语和字符方法:/[\u4E00-\u9FA5\uF900-\uFA2D]/
说明:
u4e00-u9fbf : unicode CJK(中日韩)统一表意字符。u9fa5晚到u9fbf为空
uF900-uFAFF : 为unicode CJK 兼容象形文字 。uFA2D后及uFAFF为空

复制代码 代码如下:

var str=”这是一个基础字符串”;
var length=str.length();
//当使用length()时,Javascript说引擎会发生
//一个str的临时String对象,执行完后临时对象清除

三.争判断数据类型 (1) typeof(鸡肋)
  仅只是检测出以下6种多少列:number, string, boolean, undefined,
object, function(注意!)

复制代码 代码如下:

alert(typeof(null)); //结果为object
alert(typeof(a)); //a未赋值,结果为undefined

故此断定基础数据类型可以如下:

复制代码 代码如下:

function type(o) {
return (o === null) ? ‘null’ : typeof(o);
}

(2)instanceof
    但对于复合数据类型(除了function),则整个返回object,无法透过typeof判断
然而利用instanceof检测某个对象是匪是另外一个对象的实例,注意instanceof的右操作数必须也目标:

复制代码 代码如下:

function Animal() {};
function Pig() {};
Pig.prototype = new Animal();
alert(new Pig() instanceof Animal); // true

  instanceof不抱用来检测一个目标自我的花色

  (3)constructor

复制代码 代码如下:

alert(1.constructor); // 报错
var o = 1;
alert(o.constructor); // Number
o = null; // or undefined
alert(o.constructor); // 报错
alert({}.constructor); // Object
alert(true.constructor); // Boolean

(4)Object.toString()

复制代码 代码如下:

function isArray(o) {
return Object.prototype.toString.call(o) === ‘[object Array]’;
}

call和apply的区别:
  它们还是Function.prototype的道(针对方法的),它是Javascript引擎内在实现之。
  实际上就有限只之意几乎是同样的,要小心的地方是call(thisObj[,arg1[,
arg2[,)中的arg参数可以是变量,而apply([thisObj[,argArray]])中的参数为数组集合
  方法是放贷给其它一个对象的调用去得任务,原理及是法执行时达到下文对象改变了.

(5)总结

复制代码 代码如下:

var _toS = Object.prototype.toString,
_types = {
‘undefined’ : ‘undefined’,
‘number’ : ‘number’,
‘boolean’ : ‘boolean’,
‘string’ : ‘string’,
‘[object Function]’ : ‘function’,
‘[object RegExp]’ : ‘regexp’,
‘[object Array]’ : ‘array’,
‘[object Date]’ : ‘date’,
‘[object Error]’ : ‘error’
};

function type(o) {
return _types[typeof o] || _types[_toS.call(o)] || (o ? ‘object’
: ‘null’);
}

四.数据类型转换
Javascript有点儿种植多少列的转换方法:
  一栽是用全方位价值由同种植类型转换为其他一样种多少列(称作基本数据类型转换),
  另一样种植办法是自一个价备受领到另一样栽档次的值,并成功更换工作。
  基本数据类型转换的使以下三栽艺术:
    1.易为字符型:String(); 例:String(678)的结果吧”678″
    2.移为数值型:Number(); 例:Number(“678”)的结果吗678
    3.变换为布尔型:Boolean(); 例:Boolean(“aaa”)的结果也true
  从一个价值备受提另一样种档次的价的如果以下措施:
    1.领字符串中的整数:parseInt();
例:parseInt(“123zhang”)的结果为123
    2.领取字符串中的浮点数:parseFloat();
例:parseFloat(“0.55zhang”)的结果吧0.55

  
另外总结各种类型转换的方式

  
Number转化成字符串:String(number) 、
  Number.toString(2/8/16);//分别代表二进制\八进制\十六进制默认(无参)10上制

     toFixed(3) //保留小数点后3号
      toExponextial(3); //小数点前1各项, 小数点后3各如var
n=123456.789; n.toExponextial(3);//1.234e+5就1.234X105
   toPrecision(4); //返回指定位数
如果各数不敷了展示,则按照指数表示法(3独主意还见面4放弃5入)
 五.其他总结(容易忽视掉的东西) 1.parseInt的陷阱
以下部分摘自《Javascript精粹》:
parseInt是一个拿字符串转换为整数的函数。它遇到不数字时停解析,所以parseInt(“16”)与parseInt(“16
tons”)产生相同的结果。如果该函数提示我们出现了附加文本就吓了,但是她不会见那么做。
若该字符串第一独字符时0,那么该字符串将受冲八进制而非是十进制来求值。在八进制中,8同9休是一个数字,所以parseInt(“08”)和parseInt(“09”)产生0作为结果。这个荒唐致程序解析日期和岁月时不时起问题。幸运的凡,parseInt可以接受一个基数作为参数,如此一来parseInt(“08”,10)结果吗8.己建议乃连提供者基数参数。
另外。下面这会来得1:
  
alert(parseInt(0.0000001));
就是由于超越一定精度js就会见用科学计数法记录数字,例如:
  
alert(0.0000001);
见面博得1e-7,而parseInt会自动把参数转换成为字符串的,那实在就是:
  

复制代码 代码如下:

s = (0.0000001).toString();
alert(parseInt(s));

末段得到1纵未奇怪了。
  使用parseInt必须记住里面参数是变成为字符串再做转换的。