为何会有函数?javascript
在写代码的时候,有一些经常使用的代码须要书写不少次,若是直接复制粘贴的话,会形成大量的代码冗余;函数能够封装一段重复的
javascript
代码,它只须要声明一次
,就能够屡次
调用;css
冗余代码:html
多余的重复或啰嗦内容
缺点:java
函数声明的语法:面试
var
是用来声明变量的, 函数是用function
来声明的,一个函数通常是用来作一件事情的。
function 函数名 (){ //函数体 }
函数声明的时候,函数体并不会执行,只要当函数被调用的时候才会执行。正则表达式
调用函数的语法:json
函数名();
函数体只有在调用的时候才会执行,调用须要()
进行调用。能够调用屡次segmentfault
示例代码:数组
// 声明函数 function sayHi (){ // 函数体 console.log("Hi!!"); } // 调用这个函数 sayHi(); // console.log("Hi!!"); // 注意 console.log(sayHi); // 打印的是整个函数 // sayHi:指的就是这个函数 // ():指的是调用 // sayHi():这个函数的调用结果
一、函数声明(命名函数):dom
// 声明一个函数而且命名了 function 函数名(){ 函数体; } 函数名(); // 调用函数 /********示例代码***********/ function fn(){ console.log("哈哈哈"); } fn();
二、函数表达式(匿名函数):
// 必须先声明才能调用 var 函数名 = function(){ 函数体; } 函数名(); // 调用函数 /********示例代码***********/ var fn = function(){ console.log("哈哈哈"); } fn();
这两种函数的区别:
DOM
中注册事件的时候用的很是的多)匿名函数:
没有名字
的函数,叫作匿名函数。匿名函数没有办法直接用,须要赋值给变量
或者自调用
自调用函数也叫自执行函数,声明和调用一块儿
(function(n1,n2){ console.log(n1); // 1 console.log(n2); // 2 var name = "张三" var age = 18; function sayHello() { console.log(age); // 18 console.log(name); // "张三" } sayHello(); })(1,2)
形式参数: 在声明一个函数的时候,为了函数的功能更加灵活,有些值是固定不了的,对于这些固定不了的值。咱们能够给函数设置参数。这个参数没有具体的值,仅仅起到一个占位置
的做用,咱们一般称之为形式参数,也叫形参
。实际参数: 若是函数在声明时,设置了行参,那么在函数调用的时候就须要传入对应的参数,咱们把传入的参数叫作实际参数,也叫
实参
。
语法:
//带参数的函数声明 function 函数名(形参1, 形参2, 形参...){ //函数体 } //带参数的函数调用 函数名(实参1, 实参2, 实参3);
特色:
实参
若是多于
形参的个数:多传的参数就丢弃了实参
若是少于
形参的个数:没有传的参数,值就是undefined
。(容易出问题)示例代码:
// 设置两个形参 function getSum(num1,num2){ console.log(num1+num2); } // 调用的时候传两个值进去 getSum(10,20); // 打印出来就是 30
计算n1-n2之间全部数的乘积:
function getProduct(n1, n2) { var product = 1; for (var i = n1; i <= n2; i++) { product *= i; } console.log(product); } getProduct(1, 5); // 120
当函数执行完的时候,咱们指望函数给我一些反馈(好比计算的结果),这个时候可让函数返回一些东西。也就是返回值。函数经过
return
返回一个返回值
返回值语法:
//声明一个带返回值的函数 function 函数名(形参1, 形参2, 形参...){ //函数体 return 返回值; } //能够经过变量来接收这个返回值 var 变量 = 函数名(实参1, 实参2, 实参3);
函数的调用结果就是返回值,所以咱们能够直接对函数调用结果进行操做。
示例代码:
// 计算 n1- n2之间全部数的乘积 function getProduct(n1, n2) { var product = 1; for (var i = n1; i <= n2; i++) { product *= i; } return product; // 返回计算的值 } var pro = getProduct(1, 5); // 用变量pro接收一下返回的值 console.log(pro); // 120
注意:
return
,就表明函数结束
了。return
后面的代码不会执行了。undefined
。函数三要素包括:
关于文档注释,javascript中还有一种注释叫作文档注释,常常用在函数
声明
处,用来解释这个函数的做用。
文档注释: /** 这是文档注释 */
之后写的函数的声明,都应该加上文档注释,方便阅读
示例代码:
/** * 求圆的面积 * @param r {number} 圆的半径 * @returns {number} 圆的面积 */ function getArea (r) { return Math.PI * r * r; }
一、对任意数组从小到大排序
// 封装一个从小到大冒泡排序的函数 function bubbleSort(arr){ for(var i = 0; i < arr.length - 1; i++){ var flag = true; for(var j = 0; j < arr.length -1 -i; j++){ if(arr[j] >arr[j+1]){ flag =false; var temp = arr[j]; arr[j] = arr[j+1]; arr[j + 1] = temp; } } if(flag){ break; } } return arr; } console.log(bubbleSort([12, 56, 14, 68, 45, 25, 17, 33])); console.log(bubbleSort([25, 65, 48, 11, 15, 54, 24, 63]));
二、求任意数的阶乘(从1到n的积)
function getProduct (n){ var product = 1; for(var i = 1; i <= n; i++){ product *= i; } return product; } console.log(getProduct(5)); // 120 console.log(getProduct(3)); // 6
三、求任意数组中的最大值与最小值
function getMaxAndMin(arr) { var max = arr[0]; var min = arr[0]; for (var i = 0; i < arr.length; i++) { if (max < arr[i]) { max = arr[i]; } if (min > arr[i]) { min = arr[i]; } } return [max, min]; // 返回一个数组 } console.log(getMaxAndMin([11, 45, 59, 12, 8, 36, 14, 25])); // [59 8]
在函数中,只有全局做用域
和函数做用域
,由于在if
、while
、for
等语句中定义的变量都是全局变量。
全局变量: 在最外层
声明的变量就是全局变量,全局变量在任何地方都能访问
的到。
局部变量: 在函数中
声明的变量,就是局部变量,局部变量只有在当前函数体
内可以访问。
隐式全局变量: 没有使用var
定义的变量也是全局变量。
做用域: 变量能够发挥做用的区域
全局做用域: 在script
标签内,函数外
定义的做用域就是全局做用域。在全局做用域中定义的变量都是全局变量。
函数做用域: 在函数中
的区域叫作函数做用域,在函数做用域中定义的变量就是局部变量,只能在当前函数内访问。
js解析器执行js代码的时候,分为两个过程:预解析过程
和代码执行过程
预解析过程:
var
,再提高function
预解析例题:
第一题:
console.log(a); // 打印a这个函数总体 var a = 1; function a(){ console.log("呵呵"); } console.log(a); // 1 // 预解析后为 /** var a; function a(){ console.log("呵呵"); } console.log(a); // 打印a这个函数总体 a = 1; console.log(a); // 1 */
第二题:
var num = 10; fn1(); function fn1() { //在函数调用的时候,这个函数也会作预解析操做。 console.log(num); // undefined var num = 20; console.log(num); // 20 } console.log(num); // 10 // 预解析后为 /** var num ; function fn1() { var num; console.log(num); // undefined num = 20; console.log(num); // 20 } num = 10; fn1(); console.log(num); // 10 */
第三题:
var a = 18; var b = 30; fn(); function fn() { var b = 9; console.log(a); // undefined console.log(b); // 9 var a = 20; } // 预解析后为 /** var a; var b; function fn() { var b; b = 9; var a; console.log(a); // 本身做用域里有的就不要出去找 console.log(b); // 9 a = 20; } a = 18; b = 30; fn(); */
第四题:
fn(); var b = 10; console.log(c); // 9 console.log(b); // 10 console.log(a); // 报错 function fn() { var a = 9; b = 9; c = 9; console.log(a); // 9 console.log(b); // 9 console.log(c); // 9 } // 预解析以后 /** var b; function fn() { var a; a = 9; b = 9; c = 9; console.log(a); // 9 console.log(b); // 9 console.log(c); // 9 } fn(); b = 10; console.log(c); // 9 console.log(b); // 10 console.log(a); // 报错 */
第五题:
function fn() { console.log(num1); // undefined console.log(num2); // undefined console.log(num3); // 30 var num1 = 10; var num2 = 20; num3 = 40; console.log(num1); // 10 console.log(num2); // 20 console.log(num3); // 40 } var num1 = 20; var num3 = 30; fn(); console.log(num1); // 20 console.log(num3); // 40 console.log(num2); // 报错 // 预解析以后 /** var num1; var num3; function fn() { var num1; var num2; console.log(num1); // undefined console.log(num2); // undefined console.log(num3); // 30 num1 = 10; num2 = 20; num3 = 40; console.log(num1); // 10 console.log(num2); // 20 console.log(num3); // 40 } num1 = 20; num3 = 30; fn(); console.log(num1); // 20 console.log(num3); // 40 console.log(num2); // 报错 */
函数直接或者间接调用本身,必需要留
出口
,否则就调死了
示例代码:
// 用递归求1-100的和 /* 以前封装过一个getSum的函数好比getSum(100),就是求的1-100的和 如今咱们能够这样理解: 1-100的和咱们能够看作是 100 + getSum(99) getSum(99) 能够当作 99 + getSum(98)。。。 依次这样推下去,可是要注意,到getSum(1)的时候,要留出口,不然会一直死循环下去 */ function getSum(n) { if (n == 1) { // 必定要留出口 return 1; } return n + getSum(n - 1); } console.log(getSum(100));
回调函数:把函数当成参数来使用,那么这个函数就叫回调函数。函数也是一种数据类型
示例代码:
/* 思考,以前封装了一个bubbleSort排序的函数,可是只能排元素是数字的数组 如今想要判断字符串的长度,或者对象的属性的时候就很麻烦,就须要从新写一个函数 好比字符串长度,就须要是arr[j].length - arr[i+1].length */ function bubbleSort(arr, fn) { for (var i = 0; i < arr.length; i++) { var flag = true; for (var j = 0; j < arr.length - 1 - i; j++) { // 传一个函数进来,而且将arr[j], arr[j + 1]做为两个参数传进去 if (fn(arr[j], arr[j + 1]) > 0) { flag = false; var temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } if (flag) { break; } } } // 纯数字数组 var arr = [4, 3, 1, 6, 22, 21, 41, 4]; // 调用的时候,咱们须要将fn函数的两个参数也传进去 // 这种把一个函数做为参数传进另外一个函数的方式就叫回调函数 bubbleSort(arr, function(a, b) { // a b 就至关于 arr[j] 和 arr[j+1] return a - b; // 若是是 return b - a 就至关于,上面的 arr[j+1] - arr[j]>0 那么就是从大到小排序 }); console.log(arr); // 封装后的排序函数也能够直接根据字符串的长度进行排序了 var arrStr = ["aaa", "bb", "cccc", "d"]; bubbleSort(arrStr, function(a, b) { // 由于传进去的是一个函数,arr[j] 和 arr[j+1]是以两个参数的形式传进去的 // 当数组元素是字符串的时候,就能够进行.length操做了 return a.length - b.length; }); console.log(arrStr);
无序的键值对集合
为何要有对象?
在
javascript
中:对象跟数组、函数同样,都是一种复杂数据类型,是一系列相关的属性的集合,能够很方便对变量和函数进行管理。
什么是对象?
现实生活中: 万物皆对象,对象是一个具体的事物
,一个具体的事物就会有行为
和特征
。javascript:
javascript
中的对象其实就是生活中对象的一个抽象
。
特征
在对象中用属性
来表示。行为
在对象中用方法
来表示。举个例子:
特征:名字、性别、年龄、身高、体重、爱好、星座、血型 (属性) 行为:罚钱、吃肉、打招呼 (方法: 对象里面的函数)
经过var 对象名 = new Object();
的方式建立一个对象,经过对象名.
的语法,给这个对象添加属性
;经过通对象名.方法名 = function(){}
给这个对象加上一个方法
。
示例代码:
// 建立一个英雄对象,而且给他加上属性和方法 var hero = new Object(); // 建立一个空的英雄对象 // 经过"."语法给这个hero加上一些属性 hero.name = "盖伦"; // 给对象添加了一个name的属性 hero.skill = "正义审判"; // 给对象添加一个技能属性 // 经过 对象名.方法名 = function(){} 给hero加上一个方法 hero.attack = function() { console.log("盖伦攻击了小怪物"); } attack();
经过var 对象名 = {}
的方式建立一个对象,经过键值对
的方式,给这个对象加上属性和方法。字面量:
11
"abc"
true
[]
{}
等{}
就至关于new Object();
示例代码:
// 建立一个英雄对象,而且给他加上属性和方法 var hero = { name : "盖伦", // 键值对的形式给hero加上属性 skill : "正义审判", attcck : function(){ // 键值对的形式给hero加上方法 console.log("盖伦攻击了小怪物"); } }
注意: 键值对之间用,
号隔开
示例代码:
var hero = { name : "盖伦", skill : "正义审判", attcck : function(){ // 这里的this指向的是当前的对象,表示当前对象下的skill属性,若是直接写skill 是报错的 console.log("盖伦使用了"+this.skill+"攻击了敌人"); } }
注意:
this
必定要出如今方法中才有意义,不在方法中的this
没有意义。this
,指的是当前对象
,即调用这个方法的对象操做对象的属性分为存值
和取值
存值:
对象名.属性名 = "值";
存值-示例代码:
var obj = { age:18, name:"盖伦" }; // 存值 obj.hobby = "K人"; obj.age = 20; console.log(obj); // {age:20,name:"盖伦",hobby:"K人"}
存值-注意:
有
这个属性,会覆盖
原来的值。没有
这个属性,就会新增长
这个属性。(属性在对象中是独一无二的)取值:
对象名.属性名
取值-示例代码:
var obj = { age:18, name:"盖伦" }; // 取值 console.log(obj.age); // 18 console.log(obj.name); // "盖伦"
取值-注意:
有
这个属性,就会返回对应的值没有
这个属性,就会返回undefined
。关联数组的语法,把对象当成数组来看待
存值:
对象名[属性名(下标)] = "值";
数组的下标是数字,对象的下标是字符串
存值-示例代码:
var obj = { age:18, name:"盖伦" }; // 存值 obj["hobby"] = "K人"; obj["age"] = 20; console.log(obj); // {age:20,name:"盖伦",hobby:"K人"}
取值:
对象名[属性名(下标)]
取值-示例代码:
var obj = { age:18, name:"盖伦" }; // 取值 console.log(obj["age"]); // 18 console.log(obj["name"]]); // "盖伦"
注意: []
语法是将对象当数组看,数组的下标是数字
,对象的下标是字符串
,取值的时候必定要注意
当属性名是一个字符串存储在变量中的时候,只能使用
关联数组
的方式。
示例代码:
var obj = { age:18, name:"盖伦" }; var temp = "age"; console.log(obj[temp]); // 打印 18 ==> obj["age"] console.log(obj.temp); // 点语法就不行,undefined 点语法会去对象中找temp的属性
大部分状况,都用.
语法,比较简单,若是属性的名字存在一个变量中,只能用[]
语法
经过for..in
语法能够遍历一个对象:for(var键
in对象
)
示例代码:
var hero = { name : "盖伦", skill: "正义审判", attcck: function() { console.log("盖伦使用了" + this.skill + "攻击了敌人"); } } for(var key in hero){ // key表示的是对象的属性名 console.log(key); // 遍历了全部的属性名 console.log(hero[key]); // 遍历全部的值 console.log(hero.key); // undefined 这样写是错的,找的是hero的key属性 }
遍历对象案例:
var datas = [ {name:"露娜", age:18, score:100, gender:"男"}, {name:"妲己", age:1000, score:101, gender:"女"}, {name:"甄姬", age:888, score:102, gender:"女"}, {name:"大乔", age:21, score:103, gender:"女"}, {name:"小乔", age:22, score:104, gender:"女"} ]; document.write("<table>"); for (var i = 0; i < datas.length; i++) { document.write("<tr>"); var data = datas[i]; for (var key in data) { document.write("<td>"); document.write(data[key]); document.write("</td>"); } document.write("</tr>"); } document.write("</table>");
效果图:
注意:遍历的时候for
后面是键(属性名),in
后面是对象
判断一个对象中是否有某一属性:
in
关键字能够查看对象是否拥有某个属性。
var obj = { name:"zs", age:18, score:100 } //in关键字能够查看对象是否拥有某个属性。 console.log( "sex" in obj ); // false console.log( "name" in obj ); // true
一、typeof 查看对象类型
全部的复杂类型,使用typeof
关键字的话,都是object
示例代码:
var arr = new Array(); console.log(typeof arr); // Object var obj = new Object(); console.log(typeof obj); // Object var student = new Object(); console.log(typeof student); // Object function fn(){ } console.log(typeof student); // Function
注意:
typeof
只能区分出来是复杂类型,并不能区分出具体类型typeof
能够查看到它的类型二、instanceof 查看对象类型
instance
: 实例 这种方法也不能直接得到对象的具体类型
示例代码:
var arr = new Array(); console.log(arr instanceof Array); // true 说明arr的实例是Array
这种方法仍是比较麻烦,看下面这种方法
三、.constructor.name 查看对象类型
借助于js原型里的
constructor
关键字,能够直接获取到对象的具体类型
示例代码:
var arr = new Array(); console.log(arr.constructor.name); // Array var obj = new Object(); console.log(obj.constructor.name); // Object
一、使用普通函数批量建立对象
将建立对象封装在一个函数里,须要批量建立对象的时候,只需调用这个函数便可
示例代码:
// 封装 function createObj(name,age,gender){ var heros = new Object(); student.name = name; student.age = age; student.gender = gender; student.sayHello = function () { console.log("你们好,我是"+this.name); } return heros; } // 调用 var stu1 = createObj("露娜",15,"女"); console.log(stu1); // 打印这个对象 stu1.sayHello(); // "你们好我是露娜" var stu2 = createObj("小乔",800,"女"); console.log(stu2); // 打印这个对象 stu2.sayHello(); // "你们好我是小乔"
优势:能够同时建立多个对象
缺点:建立出来的没有具体的类型,都是object
类型的
二、构造函数批量建立对象
构造函数 ,是一种特殊的函数。主要用来在建立对象时初始化对象(给对象加属性和方法),即为对象成员变量赋初始值,总与new
运算符一块儿使用在建立对象的语句中。通常建立一个对象的时候直接
new object
出来的没有具体的类型,都是object
类型的,要想分类的更清楚就须要用到构造函数建立对象首字母须要大写,一般是名词,表示一类对象。
语法:
// 首字母须要大写,一般是名词,表示一类对象。 function Teacher(){ // 函数体 } var cjk = new Teacher(); // 若是没有new, cjk就是一个普通的函数 console.log(cjk.constructor.name); // 输出的对象类型为 Teacher
示例代码:
// 构造函数 this指向new出来的新对象 function Teacher(name, age){ this.name = name; this.age = age; this.sayHello = function () { console.log("你们好,我是"+this.name+",今天晚上我给你们唱首歌"); } } // new 建立了一个空对象 类型为Teacher var cjk = new Teacher("苍井空", 18); console.log(cjk); // 对象的类型为Teacher {name:"苍井空",age:18} var bdyjy = new Teacher("波多野结衣", 19); console.log(bdyjy); // 对象的类型为Teacher {name:"波多野结衣",age:19,sayHello:function(){}} bdyjy.sayHello(); // 你们好,我是波多野结衣,今天晚上我给你们唱首歌
new作了四件事情:
new
会建立一个空的对象,而且对象的类型是new
后面跟的名字;this
指向这个空对象,操做this
就至关于操做了这个对象;优势:
案例-批量建立一个英雄对象:
//属性:名字、性别、技能、口号、等级、金钱 //行为:打怪兽 function Hero(name, gender, skill, slogan, level, money){ //给this加属性和方法 this.name = name; this.gender =gender; this.skill = skill; this.slogan = slogan; this.level = level; this.money = money; this.attack = function (n) { console.log(this.name + "使用了" + this.skill + "攻击了" + n); } } var atm = new Hero("奥特曼", "不详", "激光", "呵呵", 100, 0); console.log(atm); // 返回了一个Hero类型的对象 atm.attack("小怪兽"); // 奥特曼使用了激光攻击了小怪兽 var dm = new Hero("盖伦", "男", "大宝剑", "人在塔在", 18, 3150); console.log(dm); // 返回了一个Hero类型的对象 dm.attack("防护塔"); // 盖伦使用了大宝剑攻击了防护塔
一、值类型(简单数据类型)
值类型 : 又叫简单数据类型,例如:number
、string
、boolean
、undefined
、null
变量储存数据的时候,存储的直接就是这个值自己
示例代码:
var num = 12; var num1 = num; num1 = 20; console.log(num); // 12 console.log(num1); // 20
二、引用类型(复杂数据类型)
引用类型 :又叫复杂数据类型,例如:Object
、Function
、Array
和自定义
类型
变量在储存数据的时候,不会直接存储这对象,存储的是这个对象的地址
示例代码:
var obj = { // 在内存中存储了一个地址 name: "凹凸曼", age: 100 } var obj1 = obj; // 把这个地址赋值给了obj1,obj1就有了obj的全部属性 obj1.name = "奥特曼"; // 由于obj1 和 obj 用的是同一个地址,因此当obj1的属性值改变的时候,obj也会改变 console.log(obj.name); // "奥特曼" console.log(obj1.name); // "奥特曼"
引用类型详解:
//复杂类型变量不会存这个对象,只会存这个对象的地址。 var hero = { name: "大黄蜂", age: 100, car: { name: "科迈罗", price: 400000 }, brothers: ["擎天柱", "铁皮", "救护车"] }; console.log(hero.car.name); // "科迈罗" console.log(hero.brothers[0]); // "擎天柱"
面试题(一):
var num1 = 55; var num2 = 66; function f1(num, num1) { num = 100; num1 = 100; num2 = 100; console.log(num); //100 console.log(num1); //100 console.log(num2); //100 } f1(num1, num2); console.log(num1); //55 console.log(num2); //100 console.log(num); //报错
面试题(二):
function Person(name, age) { this.name = name; this.age = age; } var p1 = new Person("zs", 18); var p2 = p1; p2 = new Person("ls", 20); p2.name = "ww"; console.log(p1.name); // zs console.log(p2.name); // ww
三、栈内存与堆内存
栈内存: 空间比较小,但运算速度很是的快堆内存:空间很是大,但运算速度相对而言比较慢
简单类型有没有属性和方法?JS
为了咱们操做方便,内置了对应的复杂类型(String
、Number
、Boolean
)
咱们使用简单类型的时候,能够直接使用复杂类型的属性和方法。(js
会自动帮咱们把简单类型转换成复杂类型。用完以后,又自动的给咱们转成了简单类型)
简单类型: number
string
boolean
undefined
null
复杂类型: Object
Function
Array
String
Number
Boolean
基本包装类型:
string
number
boolean
基本类型来讲,能够直接使用属性和方法。不是数组,是对象, 叫伪数组(能够跟数组同样的使用下标,也能够遍历)
var obj = { 0:"呵呵", 1:"哈哈", 2:"嘻嘻", 3:"嘿嘿嘿", 4:"呜呜", length:5 } for(var k in obj){ console.log(obj[k]); }
JavaScript中,arguments
对象是比较特别的一个对象,其实是当前函数的一个内置属性。也就是说全部函数都内置了一个arguments
对象,arguments
对象中存储了传递的全部的实参。arguments
是一个伪数组
,所以及能够进行遍历
示例代码:
// Math.max 的原理是什么? // 不知道形参个数的时候,怎么判别一个最大值或者最小值呢? // arguments对象中 存储的是全部的实参 是以一个伪数组的形式存在的 function max(){ var m = arguments[0]; // 因此无论你传多少参数进来,arguments就储存多少参数 for(var i = 0; i < arguments.length; i++) { if(m < arguments[i]){ m = arguments[i]; } } return m; } } console.log(max(1, 2, -1)); // 2 console.log(max(1, 2, 4, 10)); // 10
JSON
(JavaScript Object Notation
)是一种轻量级的数据交换格式,采用彻底独立于语言的文本格式,是理想的数据交换格式。同时,JSON
是JavaScript
原生格式,这意味着在JavaScript
中处理JSON
数据跟处理对象是同样的。
JSON
的属性必须用双引号引发来,对象字面量能够省略
示例代码:
// js里面,属性名能够用双引号引发来,也能够不引发来。 var obj = { name:"张三", age:18 } // JSON属性名必须用双引号引发来 var json = { "name":"张三", "age":18 } //json是js对象 js对象不必定是json console.log(json.name); // "张三" console.log(json["name"]); // "张三"
json对象的两个方法:
JSON
格式使用:JSON.stringify
;JSON
装换为对象格式:JSONparse()
;
JS内置对象就是指
Javascript
自带的一些对象,供开发者使用,这些对象提供了一些经常使用的的功能。
常见的内置对象有Math
、String
、Array
、Date
等
Math
对象中封装不少与数学相关的属性和方法。Math
对象比较特殊,不须要new
。
一、属性 PI
Math.PI
表示的就是圆周率,一般计算圆的周长或者面积的时候会用到。也能够用做表示角度、弧度(π= 180°
)
console.log(Math.PI); // 3.141592653589793
二、最大值/最小值
Math.max(x,y)
表示求出二者之间的最大值
console.log(Math.max(10,99)); // 返回99
Math.min(x,y)
表示求出二者之间的最小值
console.log(Math.min(10,99)); // 返回10
三、取整
Math.ceil()
天花板函数(向上取整)
整数
向上取整仍是整数
;正小数
向上取整,整数部分加1
,小数部分舍去
;负小数
向上取整,整数部分不变
,小数部分舍去
;示例代码:
console.log(Math.ceil(2)); // 2 console.log(Math.ceil(1.2)); // 2 console.log(Math.ceil(1.8)); // 2 console.log(Math.ceil(-1.2)); // -1 console.log(Math.ceil(-1.8)); // -1
Math.floor()
地板函数(向下取整)
整数
向下取整仍是整数
;正小数
向下取整,整数部分不变
,小数部分舍去
;负小数
向下取整,整数部分减1
,小数部分舍去
;示例代码:
console.log(Math.floor(2)); // 2 console.log(Math.floor(1.2)); // 1 console.log(Math.floor(1.8)); // 1 console.log(Math.floor(-1.2)); // -2 console.log(Math.floor(-1.8)); // -2
Math.round()
四舍五入(若是是.5,则取更大的那个数)
正小数
四舍五入,对小数点后面一位数进行判断,大于等于5
整数部分加1
,小数舍去;小于5
,整数部分不变
,小数部分舍去
负小数
四舍五入,对小数点后面一位进数行判断:
小于5
的时候,小数舍去
,整数部分不变
;大于5
的时候,小数舍去
,整数部分减 1
;等于5
的时候要再判断
,若是后面没有数
了,小数舍去
,整数部分不变
;若是后面还有数
,小数舍去
,整数部分减 1
;示例代码:
console.log(Math.round(1.2)); // 1 console.log(Math.round(1.5)); // 2 console.log(Math.round(1.56)); // 2 console.log(Math.round(1.6)); // 2 console.log(Math.round(-0.3)); // 0 console.log(Math.round(-0.6)); // -1 console.log(Math.round(-1.5)); // -1 console.log(Math.round(-1.6)); // -2 console.log(Math.round(-1.56)); // -2
四、随机数
Math.random()
返回一个[0,1)
之间的数,能取到0
,取不到1
示例代码:
// 得到0-5的随机数,包括0-5 // parseInt:取整 console.log(parseInt(Math.random() * 6)); // 由于随机数 能取到0,取不到1,要想返回5 就须要乘以6 // 得到3-5之间的随机数 // 3-5?能够先取到随机数0-2,而后再加3 得到的就是3-5 console.log(parseInt(Math.random() * 3) + 3);
五、绝对值
Math.abs()
对一个数进行绝对值操做,纯数字字符串也能够转换
示例代码:
console.log(Math.abs(-11)); // 11 console.log(Math.abs(11)); // 11 console.log(Math.abs("-11")); // 11 console.log(Math.abs("aaa")); // NaN
六、次幂和开平方
Math.pow(num, power)
求 num 的 power 的次方
示例代码:
console.log(Math.pow(2,4)); // 2的4次方 16
Math.sqrt(num)
为 num 开平方根
示例代码:
console.log(Math.sqrt(9)); // 为9开平方根 3
Data
对象是用来处理日期和时间的
使用构造函数建立一个当前时间对象
var date = new Date();
var date = new Date(); console.log(date); // Fri Nov 17 2017 11:59:19 GMT+0800 (中国标准时间)
建立一个指定时间的日期对象
var date = new Date(指定时间);
var date = new Date("2017-03-22"); //建立一个指定时间的日期对象 Wed Mar 22 2017 08:00:00 GMT+0800 (中国标准时间) var date = new Date("2017-03-22 00:52:34"); //建立一个指定时间的日期对象 Wed Mar 22 2017 00:52:34 GMT+0800 (中国标准时间)
日期格式化,通常用到的很少,经过格式化能够得到当前日期的日期部分或者时间部分
var date = new Date(); date.toString(); // 默认的日期格式 date.toLocalString(); // 本地风格的日期格式(存在兼容性) date.toDateString(); // 得到当前日期时间的,日期部分 Fri Nov 17 2017 date.toLocalDateString(); // 本地风格的日期部分(存在兼容性) date.toTimeString(); // 得到当前日期时间的,时间部分 13:23:42 GMT+0800 (中国标准时间) date.toLocalTimeString(); // 本地风格的时间部分(存在兼容性)
getMilliseconds();
获取毫秒值getSeconds();
获取秒getMinutes();
获取分钟getHours();
获取小时getDay();
获取星期,0-6
0
:星期天getDate();
获取日,即当月的第几天getMonth();
返回月份,注意从0
开始计算,这个地方坑爹,0-11
getFullYear();
返回4
位的年份 如 2016
示例代码:封装一个格式 xxxx-xx-xx xx:xx:xx 的日期函数
var date = new Date(); var year = date.getFullYear(); // 获取当前时间的年份 var month = date.getMonth() + 1; // 获取当前时间的月份,注意月份是从0开始的0-11,因此加1 addZore(month); // 得到的月份有多是一位数,此时须要给他再拼接一位 var d = date.getDate(); // 得到当前时间的日期天数 addZore(d); var h = date.getHours(); // 获取当前时间的小时 addZore(h); var m = date.getMinutes(); // 获取当前时间的分钟 addZore(m); var s = date.getSeconds(); // 获取当前时间的秒 addZore(s); function addZore(n) { return n > 10 ? n : "0" + n; // 判断获取到的数字大于10的时候 返回自己,小于的时候须要拼串 } var dateStr = year + "-" + month + "-" + d + " " + h + ":" + m + ":" + s; console.log(dateStr); // 2017-11-17 13:58:53
1970年01月01日00时00分00秒起至如今的总毫秒数叫作时间戳
获取时间戳:
var date = new Date(); // 方法一 console.log(date.getTime()); // getTime的方法得到毫秒数 // 方法二 console.log(+date); // 直接经过计算的方式转换成毫秒数
示例代码:计算代码执行的时间
var start = new Date(); var sum = 0; // 电脑性能很差的小伙伴 不要这么搞 循环的次数少一点 for (var index = 0; index < 1000000000; index++) { sum += index; } console.log(sum); // 499999999067109000 var end = new Date(); console.log(end - start); // 17899
数组对象在javascript中很是的经常使用
将数组的值拼接成字符串
语法:array.join(separator)
逗号
join()
方法的括号里传入其余的拼接字符示例代码:
var arr = ["大乔","小乔","甄姬","妲己","露娜"]; var str = arr.join(); console.log(str); // "大乔,小乔,甄姬,妲己,露娜" // 用“-”拼接符 var arr2 = ["大乔","小乔","甄姬","妲己","露娜"]; var str2 = arr2.join("-"); console.log(str2); // "大乔-小乔-甄姬-妲己-露娜"
一、arr.push()
在数组最后面 添加元素,返回新数组的长度
var arr = ["大乔","小乔","甄姬"]; console.log(arr.push("妲己", "露娜")); // 返回 5 console.log(arr); // ["大乔","小乔","甄姬","妲己","露娜"]
二、arr.pop()
在数组最后面删除一个元素,返回删除的那个元素
var arr = ["大乔","小乔","甄姬","妲己", "露娜"]; console.log(arr.pop()); // 返回 "露娜" console.log(arr); // ["大乔","小乔","甄姬","妲己"]
三、arr.unshift()
在数组前面添加元素,返回新数组的长度
var arr = ["甄姬","妲己", "露娜"]; console.log(arr.unshift("大乔","小乔")); // 返回 5 console.log(arr); // ["大乔","小乔","甄姬","妲己", "露娜"];
四、arr.shift()
在数组最前面删除一个元素,返回删除的那个元素
var arr = ["大乔","小乔","甄姬","妲己", "露娜"]; console.log(arr.shift()); // 返回 "大乔" console.log(arr); // [小乔","甄姬","妲己", "露娜"];
示例代码(一):
var arr = ["刘备"]; //添加数据后变成:["赵云","马超","刘备","关羽","张飞"] arr.push("关羽","张飞"); arr.unshift("赵云","马超"); console.log(arr); // ["赵云","马超","刘备","关羽","张飞"] //删除数据后变成:["关羽","张飞"] arr.shift(); arr.shift(); arr.shift(); console.log(arr); // ["关羽","张飞"]
示例代码(二):
var arr = ["赵云","马超","刘备","关羽","张飞"]; //把数组的最后一个元素变成数组的第一个元素 arr.unshift(arr.pop()); console.log(arr); // ["张飞","赵云","马超","刘备","关羽"]
一、arr.reverse()
翻转数组
var arr = [1,2,3,4,5]; var newArr = arr.reverse(); console.log(newArr); // [5,4,3,2,1] console.log(arr); // [5,4,3,2,1]
二、arr.sort()
数组排序
传递一个函数
做为参数
,这个参数用来控制数组如何进行排序a-b
从小到大排序,b-a
从大到小排序var arr = [1,3,5,7,9,2,4,6,8,10]; var newArr = arr.sort(function(a,b){ // 若是返回值>0,则交换位置 return a - b; }); console.log(newArr); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] console.log(arr); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
示例代码(一):
// 将字符串数组按照字符长度从大到小排列 var arr = ["ccc", "bb", "a", "dddd"]; arr.sort(function (a, b) { return b.length - a.length; }); console.log(arr); // ["dddd", "ccc", "bb", "a"]
示例代码(二):
//将学生数组按照年龄从小到大排列 var arr = [ {name:"张三", age: 18, score: 50}, {name:"李四", age: 70, score: 95}, {name:"王五", age: 9, score: 33}, {name:"赵六", age: 38, score: 100}, {name:"田七", age: 6, score: 8}, {name:"王八", age: 22, score: 66} ]; arr.sort(function(a, b) { return a.age - b.age; }); console.log(arr);
一、concat
数组的合并
var arr1 = [1, 3, 5, 7, 9]; var arr2 = [2, 4, 6, 8, 10]; // concat: 合并两个数组 var newArr = arr1.concat(arr2); console.log(newArr); // [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
不会影响原来的数组,会返回一个新的数组
二、slice
数组切分
复制
数组的一部分(浅拷贝)到一个新数组,并返回这个数组,原来的数组不受影响
slice
有两个属性,分别是开始的
下标和结束的
下标,截取的时候包含begin
,不包含end
var arr = [1, 3, 5, 7, 9]; // slice: 截取数组的一部分 var newArr = arr.slice(0,3); console.log(newArr); // [1, 3, 5]
三、splice
数组拼接
splice
:数组拼接,以新元素
来替换旧元素
,以此来修改数组的内容,经常使用于删除数组
的某些项
array.splice(start, deleteCount, [items]);
start
:开始下标 deleteCount
:删除的个数 items
:替换的内容
splice 能实现多种用法:
0
,再输入替换的内容,此时就能够在数组中任意位置添加
元素替换
元素删除
任意个数的元素var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // 从下标是2的位置开始,删除0个,把 100 101 添加进去 var newArr = arr.splice(2, 0, 100, 101); console.log(newArr); // 操做的是原数组,不会返回这个新数组 console.log(arr); // [1, 2,100,101,3, 4, 5, 6, 7, 8, 9, 10] // 也能够替换元素 (此时arr = [1, 2,100, 101, 3, 4, 5, 6, 7, 8, 9, 10] ) arr.splice(0, 2, 98, 99); console.log(arr); // [98, 99, 100, 101, 3, 4, 5, 6, 7, 8, 9, 10] // 也能够用于删除数组里的多个元素 (此时arr = [98, 99, 100, 101, 3, 4, 5, 6, 7, 8, 9, 10] ) arr.splice(0, 4); console.log(arr); // [3, 4, 5, 6, 7, 8, 9, 10]
indexOf()
方法,是用来查找数组中,某个元素首次出现
的位置,下标从0
开始,找到的话返回位置信息,当找不到的时候返回-1
arr.indexOf(search,[fromIndex])
;search
:须要搜索的元素,fromIndex
:规定在字符串中开始检索的位置。
示例代码:
var arr = [1, 5, 8, 11, 1, 2, 9]; arr.indexOf(8); // 返回2 arr.indexOf(8,1) // 从下标1,日后查找 返回 2 arr.indexOf(10); // 返回-1 说明找不到
与之对应的还有一个lastIndexOf()
,从后往前找
var arr = [1, 5, 8, 11, 1, 2, 9]; arr.lastIndexOf(1); // 返回4 arr.lastIndexOf(1,3) // 从下标3,往前查找 返回0 arr.lastIndexOf(10); // 返回-1 说明找不到
一、删除数组中的全部元素
var arr = [1,2,3,4,5]; arr.splice(0,arr.length); console.log(arr); // []
二、直接修改数组的长度
var arr = [1,2,3,4,5]; arr.length = 0; console.log(arr); // []
三、将数组赋值为一个空的数组
var arr = [1,2,3,4,5]; arr = []; console.log(arr); // []
var arr = ["c", "a", "z", "a", "x", "a", "a", "z", "c", "x", "a", "x"]; //1. 找到数组中第一个a出现的位置 console.log(arr.indexOf("a")); // 1 //2. 找到数组中最后一个a出现的位置 console.log(arr.lastIndexOf("a")); // 10 //3. 找到数组中每个a出现的位置 for (var i = 0; i < arr.length; i++) { if (arr[i] == "a") { console.log(i); // 1 3 5 6 10 } } //4. 数组去重,返回一个新数组 var newArr = []; for (var i = 0; i < arr.length; i++) { if (newArr.indexOf(arr[i]) == -1) { // 判断当newArr的数组里没有arr[i]的时候 newArr.push(arr[i]); // 将arr[i] 添加到newArr中 ["c", "a", "z", "x"] } } console.log(newArr); //5. 获取数组中每一个元素出现的次数 // 首先须要知道 如何判断一个对象中是否存在某属性 /* var obj = { name:"zs", age:18, score:100 } //in关键字能够查看对象是否拥有某个属性。 console.log( "sex" in obj ); // false */ var obj = {}; for(var i = 0; i < arr.length; i++){ // 遍历数组,判断对象有没有这个属性, if(arr[i] in obj){ // 若是有这个属性,让这个属性的值+1 obj[arr[i]] ++; }else{ // 若是没有这个属性,让这个属性等于1 obj[arr[i]] = 1; } } console.log(obj);
字符串能够当作是一个字符数组(伪数组)。所以字符串也有长度,也能够进行遍历。String
对象不少方法的名字和和Array
的同样。
// 遍历一段字符串 var str = "abcdefghijk"; for(var i = 0; i < str.length; i++){ console.log(str[i]); // "a" "b" "c" "d"... }
小写转换成大写
toUpperCase()
,toLocaleUpperCase()
是将英文小写的字符串转换为大写,其中toLocaleUpperCase()
方法则是针对特定地区的实现(如土耳其语会为Unicode大小写转换应用特殊的规则)。
var str = "hello world"; str.toUpperCase(); // "HELLO WORLD" str.toLocaleUpperCase();
大写转换成小写
toLowerCase()
,toLocaleLowerCase()
是将英文小写的字符串转换为大写
var str = "HELLO WORLD"; str.toUpperCase(); // "hello world" str.toLocaleUpperCase();
注意: 由于是方法,因此必定不要忘记加上()
indexOf()
方法,是用来判断指定字符,在当前字符串中首次出现
的位置,下标从0
开始,找到的话返回位置信息,当找不到的时候返回-1
示例代码:
var str= "good good study , day day up!"; str.indexOf("day"); // 返回18 str.indexOf("good"); // 返回0 str.indexOf("GOOD"); // 返回-1 说明找不到
与之对应的还有一个lastIndexOf()
,是用来从后面开始查找字符第一次出现的位置
var str= "good good study , day day up!"; str.lastIndexOf("good"); // 返回 5
trim();
方法,是用来去除字符串两边的空格,内部空格不会去除
var str = " A B C "; console.log(str.trim()); // "A B C"
slice()
方法是用来截取一段字符串的,str.slice(start,end);
它的两个参数都是表示下标的,一个表示开始,一个表示结束(截取时不包括结束下标)
说明:
start
下标从0
开始的str指定部分起始索引。若是start
为负,将它做为length+start
处理,此处length
为字符串的长度。end
下标从0
开始的str指定部分结束索引。若是end
为负,将它做为length+end
处理,此处length
为字符串的长度。示例代码:
// 起始位置结束位置都是正数 var str = "ABCDEFGHIJK"; str.slice(2,6); // "CDEF"
// 当起始位置为负数的时候 var str = "ABCDEFGHIJK"; str.slice(-6, 10); // "FGHIJ" // str的length为11,因此起始位置是-6+11=5,就是F结束是10(不包括10),那么就是J;
// 特殊状况 当起始位置在结束位置后面的时候,是截取不了的,返回空 var str = "ABCDEFGHIJK"; str.slice(-6, 2); // 空 // str的length为11,因此起始位置是-6+11=5,就是F,结束位置在2,这个时候是截取不了的
注意:
end
为结束下标,截取的时候不包括end
那一位substring()
方法返回位于String对象中指定位置的子字符串,str.substring(start,end);
它的两个参数都是表示下标的,一个表示开始,一个表示结束(截取时不包括结束下标)
说明:
start
指明子字符串的起始位置
,该索引从0
开始起算。end
指明子字符串的结束位置
,该索引从0
开始起算。substring
方法使用start
和end
二者中的较小值做为子字符串的起始点。若是start
或end
为NaN
或者为负数,那么将其替换为0
。示例代码:
// 当起始位置,结束位置都是正数的时候 var str = "ABCDEFGHIJK"; str.substring(2,6); // "CDEF" // 一样的,substring方法结束位置也不包括本身
// 当起始位置为负数的时候,直接转换成下标0 var str = "ABCDEFGHIJK"; str.substring(-2,6); // "ABCDEF" 下标转换成了0
// 当开始的位置大于结束位置的时候,自动转换较小的值做为起点 var str = "ABCDEFGHIJK"; str.substring(6,2); // "CDEF"
利用substring方法,实现打字效果
/*样式部分*/ #box { width: 300px; height: 150px; border: 2px dashed fuchsia; margin: 100px auto; text-align: left; padding: 10px; }
<!--html部分--> <div id="box"></div> <!--js部分--> <script> var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var strLength = str.length; var index = 0; setInterval(function() { if (index >= strLength) { return; } index++; document.getElementById('box').innerHTML = str.substring(0, index); }, 100); </script>
注意:
substring
方法,end
为结束下标,截取的时候一样不包括end
那一位start
的值大于end
的时候,二者中较小的值做为起始下标substr()
方法返回一个从指定位置开始,指定长度的子字符串。str.substr(start,length)
,start
为开始的下标,length
为须要返回字符串的长度
说明:
start
所需的子字符串的起始位置。字符串中的第一个字符的索引为0
。length
在返回的子字符串中应包括的字符个数。示例代码:
var str = "ABCDEFGHIJK"; str.substr(1,5); // BCDEF
match()
来查找字符串中特定的字符,而且若是找到的话,则返回这个字符,找不到的话返回null
。
示例代码:
var str= "good good study , day day up!"; str1.match("good"); // good str1.match("Good"); // null
replace()
方法在字符串中用某些字符替换另外一些字符。
示例代码:
var str2 = "hello world"; str2.replace("world", "china"); // "hello china"
将一个字符串分割为子字符串,而后将结果做为字符串数组返回。str.split(separator,num)
,带一个参数separator
表示切割的条件,第二个参数num
表示须要切割的位数
说明:
separator(分隔符)
字符串或正则表达式
对象,它标识了分隔字符串时使用的是一个仍是多个字符。若是忽略该选项,返回包含整个字符串的单一元素数组。num
该值用来限制返回数组中的元素个数。示例代码:
var str = "ABCDEFGHIJK"; str.split("",6); // ["A", "B", "C", "D", "E", "F"]
一、翻转一个字符串
var str = "abcdefg"; var strArr = str.split(""); // 将字符串转换为数组 ["a","b","c","d","e","f","g"] strArr.reverse(); // 翻转这个数组 ["g","f","e","d","c","b","a"] var newStr = strArr.join(""); console.log(newArr); // "gfedcba"
二、将一串字符转化成对象
/* 有一个连接:http://www.baidu.com?name=cc&id=100&desc=很帅 将连接的参数部分转换成一个对象 即{name:"cc", id=100 , desc: "很帅"} */ var str = "http://www.baidu.com?name=cc&id=100&desc=很帅"; var obj = {}; var strArr = str.split("?"); // ["http://www.baidu.com", "name=cc&id=100&desc=很帅"] var strArr2 = strArr[1].split("="); // ["name=cc", "id=100", "desc=很帅"] for(var i = 0; i < strArr2.length; i++){ console.log(strArr2[i]); // "name=cc" "id=100" "desc=很帅" var key = strArr2[i].split("=")[0]; // name id desc var value = strArr2[i].split("=")[1]; // cc 100 很帅 obj[key] = value; } console.log(obj); // {name:"cc", id=100 , desc: "很帅"}
三、将对象转换成字符串
/* 有一个对象{name:"cc", id:100,desc:"很帅"} 和一个连接http://www.baidu.com, 拼接成连接http://www.baidu.com?name=cc&id=100&desc=很帅 */ var prefix = "http://www.baidu.com"; var obj = {name:"cc", id:100,desc:"很帅"}; var arr = []; for (var key in obj) { // console.log(key); name id desc // console.log(obj[key]); "cc" 100 "很帅" var str = key + "=" + obj[key]; console.log(str); // name=cc id=100 desc=很帅 arr.push(str); console.log(arr); // ["name=cc", "id=100", "desc=很帅"] } var arrStr = arr.join("&"); console.log(arrStr); // name=cc&id=100&desc=很帅 var result = prefix + "?" + arrStr; console.log(result); // http://www.baidu.com?name=cc&id=100&desc=很帅