arguments对象
- 所有的函数都内置了这个arguments对象,用来收集所有的实参数据
- 伪数组 并不是真正意义上的数组
- 具有数组的 length 属性
- 按照索引的方式进行存储的
- 它没有真正数组的一些方法 pop() push() 等等
求任意个数数据中的最大值
// 利用函数求任意个数的最大值
function getMax() { // arguments = [1,2,3]
var max = arguments[0];
for (var i = 1; i < arguments.length; i++) {
if (arguments[i] > max) {
max = arguments[i];
}
}
return max;
}
console.log(getMax(1, 2, 3));
console.log(getMax(1, 2, 3, 4, 5));
console.log(getMax(11, 2, 34, 444, 5, 100));
js函数的两种声明方式
1.利用函数关键字自定义函数(命名函数)
function fn() {
}
fn();
2、 函数表达式(匿名函数)
var fun = function(aru) {
console.log('我是函数表达式');
console.log(aru);
}
fun('pink老师');
匿名函数注意事项:
- fun是变量名 不是函数名
- 函数表达式声明方式跟声明变量差不多,只不过变量里面存的是值 而 函数表达式里面存的是函数
- 函数表达式也可以进行传递参数
js变量的作用域
- js的作用域(es6)之前 : 全局作用域 局部作用域
- 全局作用域: 整个script标签 或者是一个单独的js文件
- 局部作用域(函数作用域) 在函数内部就是局部作用域 这个代码的名字只在函数内部起效果和作用
- 注:js没有块级作用域
从执行效率来看全局变量和局部变量
// (1) 全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
// (2) 局部变量 当我们程序执行完毕就会销毁, 比较节约内存资源
作用域链 : 内部函数访问外部函数的变量,采取的是链式查找的方式来决定取那个值 这种结构我们称为作用域链 就近原则
var num = 10;
function fn() { // 外部函数
var num = 20;
function fun() { // 内部函数
console.log(num);
}
fun();
}
fn();
预解析
// 1. 我们js引擎运行js 分为两步: 预解析 代码执行
// (1). 预解析 js引擎会把js 里面所有的 var 还有 function 提升到当前作用域的最前面
// (2). 代码执行 按照代码书写的顺序从上往下执行
// 2. 预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)
// (1) 变量提升 就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
// (2) 函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数
js创建对象的三种方式
1、
var obj = {}; // 创建了一个空的对象
var obj = {
uname: '张三疯',
age: 18,
sex: '男',
sayHi: function() {
console.log('hi~');
}
}
2、利用 new Object 创建对象
var obj = new Object(); // 创建了一个空的对象
obj.uname = '张三疯';
obj.age = 18;
obj.sex = '男';
obj.sayHi = function() {
console.log('hi~');
}
// (1) 我们是利用 等号 = 赋值的方法 添加对象的属性和方法
// (2) 每个属性和方法之间用 分号结束
console.log(obj.uname);
console.log(obj['sex']);
obj.sayHi();
注:以上两种对象的创建方式一次只能创建一个对象,代码的利用率比较低,所以需要构造函数来重复利用代码 3、利用构造函数创建对象
// new 构造函数名();
function Star(uname, age, sex) {
this.name = uname;
this.age = age;
this.sex = sex;
this.sing = function(sang) {
console.log(sang);
}
}
var ldh = new Star('刘德华', 18, '男'); // 调用函数返回的是一个对象
// console.log(typeof ldh);
console.log(ldh.name);
console.log(ldh['sex']);
ldh.sing('冰雨');
var zxy = new Star('张学友', 19, '男');
console.log(zxy.name);
console.log(zxy.age);
zxy.sing('李香兰')
构造函数注意事项: // 1. 构造函数名字首字母要大写 // 2. 我们构造函数不需要return 就可以返回结果 // 3. 我们调用构造函数 必须使用 new // 4. 我们只要new Star() 调用函数就创建一个对象 ldh {} // 5. 我们的属性和方法前面必须添加 this 我们利用构造函数创建对象的过程我们也称为对象的实例化
对象注意事项
// (1) 里面的属性或者方法我们采取键值对的形式 键 属性名 : 值 属性值
// (2) 多个属性或者方法中间用逗号隔开的
// (3) 方法冒号后面跟的是一个匿名函数
// 2. 使用对象
// (1). 调用对象的属性 我们采取 对象名.属性名 . 我们理解为 的
// (2). 调用属性还有一种方法 对象名['属性名']
(3) 调用对象的方法 sayHi 对象名.方法名() 千万别忘记添加小括号
变量和属性的区别与联系
1.变量和属性的相同点 他们都是用来存储数据的 2.变量 单独声明并赋值 使用的时候直接写变量名 单独存在 3.属性 在对象里面的不需要声明的 使用的时候必须是 对象.属性
函数和方法的异同
1、函数和方法的相同点 都是实现某种功能 做某件事 2、函数是单独声明 并且调用的 函数名() 单独存在的 3、方法 在对象里面 调用的时候 对象.方法()
new关键字执行过程
// 1. new 构造函数可以在内存中创建了一个空的对象
// 2. this 就会指向刚才创建的空对象
// 3. 执行构造函数里面的代码 给这个空对象添加属性和方法
// 4. 返回这个对象
对象的遍历
// 遍历对象
var obj = {
name: 'pink老师',
age: 18,
sex: '男',
fn: function() {}
}
for (var k in obj) {
console.log(k); // k 变量 输出 得到的是 属性名
console.log(obj[k]); // obj[k] 得到是 属性值
}
|