js 数据类型

undefined :是一个特殊的值,值类型

var message;
var isUnderfinder = message == undefined;
alert(isUnderfinder);//true
alert(typeof message);//undefined

Null:代表不存在,值类型

var car = null;
alert(typeof car);//object
if(car != null){
  // 对car对象执行操作
}
// undefined 值派生自null
alert(null == undefined);// true
// null 和 undefinde,无论何时都没有必要显式的设置变量undefined,但是null需要显式赋值
// 只要意在保存对象,还没有真正保存的时候将其设置为null,体现null座位空指针

后面介绍三个特殊的引用类型Boolean,Number,String,包装类型,注意区别值类型的三个

boolean

// true false
var message = Boolean("str");//true
var message = Boolean("");//false

number

// NaN
isNaN();
// 数值转化
var num = Number("hello");// nan
num = Number("");// 0
num = Number("000111");// 111
num = Number(true);// 1

num = parseInt("111");// 111
// 转化为int 第一个参数数值,第二个参数进制
num = parseInt("10",2);// 2
num = parseInt("10",8);// 8
num = parseInt("10",10);// 10
num = parseInt("10",16);// 16
// 转化为float
num = parseFloat("0.145");// 0.145

string

var string = "string";
// length
string.length;// 6
// +
var lang = string+" add";// string add
// 数值,对象,布尔,字符串都有个toString 的方法
var num = 10;
num.toString();// "10"
num.toString(2);// "1010"
num.toString(8);// "12"
num.toString(10);// "10"
num.toString(16);// "a"
// 转型函数
var value = 10;
alert(String(value)); // "10"
alert(String(null)); // "null"
alert(String(undefined)); // "undefined"

object

//  对象类型
var o = new Object();
// 对象所拥有的属性
Constructor:保存用于创建当前对象的函数,此处存的就是Object();
// 对象所拥有的方法
hasOwnProperty(propertyName);//检查对象是否拥有属性
isPrototytypeof(object);//对象是否是另一个对象原型
propertyIsEnumerable(propertyName);//检查属性能否用for in枚举
toLocaleString();//
toString();//
valueOf();//

Function

// 声明方式一
function sum(num1,num2){
  return num1 + num2;
}
var sum = function(num1,num2){
  return num1 + num2;
}
// 声明方式二(不推荐)
var sum = new Function("num1","num2","return num1+num2");
// 使用
function sum(num1,num2){
  return num1 + num2;
}
sum(10,10);//20
var an = sum;
an(10,10);//20
sum = null;
an(10,10);//20
// 函数是指类型非引用类型
// 没有重载
function addSomeNumber(num){
  return 100+sum;
}
function addSomeNumber(num){
  return 200+sum;
}
addSomeNumber(100);//300
//等价上面代码
var addSomeNumber = function(num){
  return sum+100;
}
addSomeNumber = function(num){
  return sum+200;
}
addSomeNumber(100);//300
// 函数声明
sum(10,10);// 完全可以运行,
function sum(num1,num2){
  return num1+num2;
}
// 下面无法运行
sum(10,10);
var sum = function (num1,num2){
  return num1+num2;
}
// 原因是函数位于初始化语句中,而不是函数声明
// 函数做为值
function call(someFunction, num){
  return someFunction(num);
}
var addSomeNumber = function(num){
  return sum+100;
}
var result =  call(addSomeNumber,100);
result;//200
// 函数可以作为返回值
function compare(propertyName){
  return function(object1,object2){
    return object1[propertyName]>object2[propertyName]
  }
}
// using
var peoples = [{name:"people1",age:23},{name:"people2",age:24}];
peoples.sort(compare("age"));
// 函数属性
// arguments.callee
function factorial(num){
  if(num<=1){
    return 1;
  }
  return num*factorial(num-1);
}
// 当函数名称改变时,num*factorial(num-1);也必须变,为了消除这个强耦合
function factorial(num){
  if(num<=1){
    return 1;
  }
  return num* arguments.callee(num-1);
}
// this 饮用的是函数执行的环境对象
window.color = "red";
var blue = {color:"red"};
function sayColor(){
  alert(this.color);
}
sayColor();// red
blue.sayColor = sayColor;
blue.sayColor(); //blue
// caller
function outer(){
  inner();
}
function inner(){
  alert(inner.caller);
}
outer();// 会显示outer函数的源代码
// 可以结合 arguments.callee使用,重写为
function inner(){
  alert(arguments.callee.caller);
}
// 注意caller 属性只读的,手动赋值导致错误
// length表示函数期望接受的参数个数
// prototype 保存所有实例方法的实际所在
// 函数的方法每个函数都包含两个非继承来的方法
// apply()
// call()
// 上面2函数的作用都是在特定的作用域内调用函数,实际等于设置函数体内this对象的值
// apple 参数2个,一个是作用域,一个是参数数组(可以是数组,亦可argument)
function sum(num1,num2){
  return sum1+sum2;
}
function callsum1(num1,num2){
  return sum.apply(this,argument);
}
function callsum2(num1,num2){
  return sum.apply(this,[num1, num2]);
}
callsum1(10,10);// 20 
callsum2(10,10);// 20 
// call和apply一样,只是参数需要一一列举出
function callsum(num1,num2){
  return sum.call(this, num1, num2);
}
callsum(10,10);// 20 
// apply call的作用主要是扩充函数的作用域
window.color = "red";
var o = {color:"blue"};
function sayColor(){
  alert(this.color);
}
sayColor.call(this);//red
sayColor.call(window);//red
sayColor.call(o);//blue
// 函数的bind()方法
// 此方法会创建一个函数实例,this值会绑定传给bind()函数的值
window.color = "red";
var o = {color:"blue"};
function sayColor(){
  alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor();//blue

Array

var color = new Array("red","blue");
color[2] = "black";
alert(color[2]);
// 数组的属性和方法
color.length;
Array.isArray(color);
color.toString();//"red,blue,black"
color.valueOf();//"red,blue,black"
color;//"red,blue,black"
// 转换方法(label语法使用)
var person1 = {
  toLocaleString:function(){
    return "nikolaos";
  }
  toString:function(){
      return "nicholas";
  }
};
var person2 = {
  toLocaleString:function(){
    return "ccc";
  }
  toString:function(){
      return "Greg";
  }
};
var peoples = [person1,person2]; 
peoples; // nicholas, Greg
peoples.toString; // nicholas, Greg
peoples.toLocaleString; //nikolaos, ccc
// 数组栈操作
// 入:push(从最上面入,即最后面),unshift(从最下面入,即最前面 )  返回长度
// 出:pop(最上面即最后一个) shift(最下面即第一个) 返回所在位置的元素
var color = new Array("blue");
var count = color.push("red","yellow");// 3
var c = color.pop();//yellow
var first = color.shift();//blue
color.length; //2
// 数组排序
reverse();// 反转数组顺序
function compare (value1,value2){
 if(value1 < value2){ 
    return -1;
  }
return 1;
}
sore(compare);//参数是fun

// 操作方法
// concat() 数组拼接,不会改变原数组
var colors = ["red","green","blue"];
var colors2 = colors.concat("yellow",["black","brown"]);// red, green, blue, yellow, black, brown
// slice() 数组裁剪,不会改变原数组
var colors = ["red","green","blue","yellow","black","brown"];
var colors2 = colors.slice(1);// green,blue,yellow,black,brown 从位置1开始
var colors3 = colors.slice(1,4);// green,blue,yellow  从位置1开始到位置4结束,不包括位置4
// splice 删除,插入,替换 ,会改变原数组
var colors = ["red","green","blue"];
var removed = colors.splice(0,1);
colors;//  green,blue
removed;// red
removed = colors.splice(1,0,"yellow","orange");//从位置1开始插入2项
colors;// green, yellow,orange,blue
removed;// 空数组
removed = colors.splice(1,1,"red","purple");//插入2项删除1项
colors;// green, red, purple,orange,blue
removed;// yellow
// 位置方法
// indexOf 从数组开头找
// lastIndexOf 从数组末尾找
// 迭代方法 以下方法都不改变数组,参数都是function
// every(); 数组每一项运行指定函数,都为true,返回true (&&)
// filter(); 数组每一项运行指定函数,返回返回true的元素组成的数组,筛选符合要求的项组成的数组
// forEach();数组每一项运行指定函数,无返回值
// map();数组每一项运行指定函数,返回返回结果组成的数组
// some();数组每一项运行指定函数,只要任一个返回结果是true则返回true (||)
// 缩小方法 参数都是function (前一个值,当前值,项的索引,数组)
// reduce() 从数组第一项开始,往后遍历
// reduceRight() 从数组最后一项开始,往前遍历
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev,cur,index,arr){
  return pre + cur;
});// 此函数的返回值座位第一个参数传递给下一项
sum;// 15
// join("|");
// 把 arrayObject 的每个元素转换为字符串,然后把这些字符串连接起来,返回一个string

date

// 1970.1.1
var now = new Date();
// 2个构造函数
Date.parse();// 参数是表示日期的字符串,返回相应日起的毫秒数,若不能被识别返回nan
//eg:
var someDate = new Date(Date.parse("May 25 , 2004"));
var someDate = new Date("May 25 , 2004");// 与上面等价
Date.UTC(); //参数是年月日时分秒毫秒,返回相应日起的毫秒数
// eg:
var y2k = new Date(Date.UTC(2000,0));// 2000年1月1日午夜零时
var all = new Date(Date.UTC(2005,4,5,17,55,55));// 2005年5月5日下午5:55:55
// 继承的方法
// 一起他引用类型一样date也重写了to string和value of to localestring 方法
// 日期格式化
toDateString()
toTimeString()
toLocaleDateString()
toLocaleTimeString()
toUTCString()
// 组件化方法如下图所示
9243219F-FFDF-417D-A97F-4F149CF003EE.png

D6E752EC-9FD5-46F2-94FA-240F7E72ABA3.png

RegExp(正则)

// g:表示全局,被应用于整个字符串,而非发现第一个立即停止 i:不区分大小写 m:表示多行模式
var pattern = /at/g;//匹配所有at实例
var pattern = /[bc]at/i;// 第一个bat或cat,不区分大小写
var pattern = /.at/gi;//以at结尾的三个字符的组合,不区分大小写
// 元字符必须转义([{\^$\)?*+.]})
// RegExp属性如下图:
2507A112-16E3-48E1-86A0-16933ED02E83.png
// 实例方法如下图:
0A34AE18-6438-4F19-A567-C801D57D7AA7.png

974330FB-4196-451D-B4DD-3D1E5CA7D51D.png

2B1BC3B2-8A01-451F-8C52-B8C18D775D7C.png
// 构造函数如下图:
8300D2AF-C329-45DF-B931-ABFD05E50A9D.png

0D562DA3-1E1A-42CC-B70C-5D0482D13420.png

三个特殊的引用类型Boolean,Number,String

String

var s1 = "some text";
var s2 = s1.substring(2);
// 可以把上面代码想象成如下三步
var s1 = new  String("some text");
var s2 = s1.substring(2);
s1 = null;
// 那么
var s1 = "some text";
s1.color = "red";
alert(s1.color);//undefined
// 原因是第二行创建的string对象在执行第三行代码的前就被销毁了,第三行代码创建了一个新的实例,此实例无color属性
// 转型函数和构造函数
var value = "25";
var number =   Number(value);//转型
alert(typeof number);//number

var obj = new Number(value);//构造
alert(typeof number);//object

Boolean

var falseObject = new Boolean(false);
var result = falseObject && true;//true
var falseValue = false;
var result = falseValue && true;//false

Number

var numberObj = new Number(10);
var num = 10;
// 对象方法
var num = 10;
num.toFixed(2);// 10.00 
num.toExponential(1);//1.0e+1
var num = 10.005;
num.toFixed(2);// 10.01

 var num = 99;
num.toPrecision(1);//1e+2 一位数无法表示99故四舍五入了
num.toPrecision(2);//99
num.toPrecision(3);//99.0

String

var stringObject = new String("hello word");
var stringValue = "hello word";
stringValue.length;// 11
stringValue.charAt(1);//e
stringValue.charCodeAt(1);//101
stringValue[1];//e

var stringValue = "hello ";
var result = stringValue.concat("word");//hello word
var result = stringValue.concat("word","!");//hello word!
stringValue;//hello
var stringValue = "hello world";
stringValue.slice(3);//lo world
stringValue.substring(3);//lo world
stringValue.substr(3);//lo world
stringValue.slice(3,7);//lo w
stringValue.substring(3,7);//lo w
stringValue.substr(3,7);//lo worl 
// 参数为负数时, 实际值 = 长度+(负数)
stringValue.slice(-3);//rld  == stringValue.slice(8);
var stringValue = "hello world";
stringValue.indexof("o");//4
stringValue.lastIndexof("o");//7
stringValue.indexof("o",6);//7 从位置6开始往后检索
stringValue.lastIndexof("o",6);//4  从位置6开始往前检索
// trim 去除首尾空
var stringValue = "   hello world   ";
var trimstringValue = stringValue.trim();//"hello world"
stringValue;//"   hello world   " 
// 大小写
// toLowerCase(),toUpperCase(); 通用
// toLocaleLowerCase(),toLocaleUpperCase(); 针对地区
// 正则匹配
var text = "cat , bat ,sat , fat";
var pattern = /.at/;
var matches = text.match(pattern);//返回数组
matches.index;//0
matches[0];//cat
pattern.lastindex;//0
//search()
var text = "cat , bat ,sat , fat";
var pos = text.search(/at/);// 1
//replace()
var text = "cat , bat ,sat , fat";
var result = text.replace("at","ond");//cond , bat , sat , fat
result = text.replace(/at/g,"ond");////cond , bond , sond , fond
// 更精细的使用见下图
31197A58-AF3C-4668-AA82-CF6A7E0B3126.png

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

推荐阅读更多精彩内容