变量和内置对象

大纲

  1. 变量
    1. 变量提升
    2. 变量作用域
    3. 一等公民
    4. 函数名提升
    5. 函数内的变量提升
    6. *函数参数的默认值
  2. 内存
  3. Math对象
  4. Date对象

变量提升

console.log(num); //undefined
var num = 10;

原因:javascript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果就是所有的变量的声明语句,都会被提升到代码的头部。javascript的这种读取变量的机制就叫做变量提升。
所以上面一段代码实际上在执行的时候是下面的过程:

var num;
console.log(num);
num = 10;

变量提升只对var命令声明的变量有效,如果一个变量不是用var命令声明的,就不会发生变量提升。

变量作用域

用var声明的变量:

console.log(num); //undefined
var num = 10;

不用var声明的变量:

console.log(num); //error
num = 10;

很明显的区别,不使用var声明的变量在使用时被系统识别为错误。这是因为javascript中存在一个叫做局部变量的东西:
var声明的变量称为局部变量。
局部变量仅在其所在的函数范围内生效,变量生效的范围被称为变量作用域。

而变量如果不使用var来声明,则表示变量在整个文件内生效。即全局变量。

一等公民

javascript世界中函数是一等公民,它不仅拥有一切传统函数的使用方式(声明和调用),而且可以做到像简单值一样赋值、传参、返回,这样的函数也称之为第一级函数或一等公民。
不仅如此,javascript中的函数还充当了类的构造函数的作用,同时又是一个Function类的实例(instance)。这样的多重身份让javascript的函数变得非常重要。

简化总结:
javascript的函数与其他数据类型(数值、字符串、布尔值等等)处于同等地位,可以使用其他数据类型的地方就能使用函数。
比如,可以把函数赋值给变量和对象的属性,也可以当做参数传入其他函数,或者把函数作为函数的结果返回。

  1. 将函数赋值给变量:
var func = function(){};
  1. 将函数赋值给对象的属性:
var frank = {
    ability:null
};
frank.ability = function(){console.log('吃');}
frank.ability();
  1. 将函数作为参数传入其他函数:
function introduce() {console.log("Hello");}
function func(func1){
    func1();
}
func(introduce);

4.将函数作为函数的结果返回:

function jsq() {return sum(3,4)}
function sum(num1,num2){return num1+num2;}
console.log(jsq());

函数名提升

javascript引擎将函数名视同变量名,所以采用function命令声明函数时,整个函数会像变量声明一样,被提升到代码头部。

console.log(sum(1,2)); //3
function sum(num1,num2){return num1+num2;}

只有function声明的函数会发生函数名提升,而如果通过赋值语句写的函数则不会。

函数内的变量提升

与全局作用域一样,函数作用域内部也会产生“变量提升”现象。var命令声明的变量,不管在什么位置,变量声明都会被提升到函数体的头部。

function foo(x) {
    if (x > 100) {
        var tmp = x - 100;
    }
}

等同于:

function foo(x) {
    var tmp;
    if (x > 100) {
        tmp = x - 100;
    }
}

函数参数的默认值

function func(num) {
    num = num || 1;
    return num;
}
console.log(func()); //1

上述写法会对函数参数num进行一次布尔运算,只有为true时才会返回num。避免了因为忘写参数而导致的函数调用失败问题。
可是除了undefined以为,0、空字符、null等的布尔值也是false。也就是说,在上面的函数中,不能让num等于0或空字符串,否则在明明有参数的情况下,也会返回默认值1。

内存

  1. [值传递]和[地址传递]
  2. 函数的同名参数
  3. argumengts对象
  4. eval函数
  5. instanceof类型检测
  6. javascript垃圾回收机制

[值传递]和[地址传递]

原始数据类型(数值、字符串、布尔值)的内容传递方式是值传递
复合数据类型(数组、对象、其他函数)的内容传递是地址传递

函数的同名函数

如果函数有同名的参数,则取最后出现的那个参数值。

function func(num,num){
    console.log(num);
}
func(1,2); //2

如果函数没有提供第二个参数,num的取值就变成了undefined。

function func(num,num){
    console.log(num);
}
func(1); //undefined

原则上来讲:尽量不要写同名参数,而且定义函数的时候写了几个参数,在调用的时候尽量保证和定义时一致。

arguments对象

由于javascript允许函数有不定数目的参数,所以我们需要一种机制来在函数内部读取所有参数。这就是arguments对象的由来。

function func(one){
    console.log(arguments[0]);  //1
    console.log(arguments[1]);  //2
    console.log(arguments[2]);  //3
    console.log(arguments[3]);  //4
}
func(1,2,3,4); 

arguments对象包含了函数[运行时]的所有参数。
arguments[0]就是函数的第一个参数,arguments[1]是第二个,以此类推。这个对象只有在[函数内部]才可以使用。

arguments对象除了可以读取参数,还可以为参数赋值。

function sum(num1,num2){
    arguments[0] = 10;
    arguments[1] = 20;
    console.log(num1+num2); //30;
}
sum(1,2); 

可以通过arguments对象的length属性,判断函数调用时究竟带几个参数。

function func(num1, num2) {
    console.log(arguments.length);
}
func(1);   //1
func(1, 2);  //2
func(1, 2, 3); //3

需要注意的是,虽然argumengts很像数组,但它是一个对象。
数组专有的方法(比如slice),不能在arguments对象上直接使用。

eval函数

eval()函数可计算某个字符串,并执行其中的javascript代码。(eval命令的作用是,将字符串当做语句执行)。

eval(string);

该方法只接受[原始字符串]作为参数,如果string参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为eval()函数传递string对象来作为参数。

eval('var num = 10;');
console.log(num);

如果eval函数在使用的过程中发生了非法调用或者传入参数出错,则会抛出异常。
虽然eval()的功能非常强大,但在实际使用中用到它的情况并不多。

instanceof类型检测

typeof用来检测基本数据类型简直是神器,但是如果是引用数据类型,则需要使用instanceof操作符。
instanceof用于判断一个变量是否是某个对象的实例。

var arr = new Array();
var obj = new Object();
console.log(arr instanceof Array);  //true
console.log(obj instanceof Array);  //false

Math对象

Math对象是javascript的内置对象,提供一系列数学常数和数学方法。该对象不是构造函数,所以不能生成实例,所有的属性和方法都必须在Math对象本身上调用。

  1. Math对象属性:Math对象的属性表示只读的数学常数。
属性说明
Math.E常数e
Math.LN22的自然对数
Math.LN1010的自然对数
Math.LOG2E以2为底的e的对数
Math.LOG10E以10为底的e的对数
Math.PI常数PI
Math.SQRT1_20.5的平方根
Math.SQRT22的平方根
  1. Math对象的方法
    属性 | 说明
    —|---
    Math.round() | 四舍五入
    Math.floor() | 返回小于参数值的最大整数(向下取整)
    Math.ceil() | 返回大于参数值的最小整数(向上取整)
    Math.abs()|返回参数值的绝对值
    Math.max()|返回最大的参数
    Math.min()|返回最小的参数
    Math.pow()|返回以第一个参数为底数、第二个参数为幂的指数值
    Math.sqrt()|返回参数值的平方根,如果参数是一个负值,则返回NaN
    Math.log()|返回以e为底的自然对数值
    Math.exp()|返回常数e的参数次方
    3.三角函数方法
属性说明
Math.sin正弦
Math.cos余弦
Math.tan正切
Math.asin反正弦
Math.acos反余弦
Math.atan反正切

Math.random()方法:返回一个0-1之间的一个伪随机数。可能等于0,但是一定小于1。

返回随机字符所组成的指定长度的字符串。

var characterDic = 
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
function getRomdomInt(min,max){
    return Math.floor(Math.random()*(max-min)+min);
}
function getRomdomStr(length){
    var result = '';
    for(var i=0;i<length;i++){
        var j=getRomdomInt(0,64);
        console.log(j);
        result+=characterDic[j];
    }
    return result;
}
console.log(getRomdomStr(4));

Date对象

Date对象是javascript提供的日期和时间的操作接口。
在javascript内部,所有日期和时间都储存为一个整数。
这个整数是当前时间距离1970年1月1日00:00:00的毫秒数,正负的范围为基准时间前后各1亿天。

  1. Date()函数
    Date函数可以被Date对象直接调用,返回一个当前日期和时间的字符串。
console.log(Date()); //Thu Oct 21 2021 11:37:13 GMT+0800 (中国标准时间)
console.log(Date(2000,1,22));//Thu Oct 21 2021 11:41:25 GMT+0800 (中国标准时间)

无论有没有参数,直接调用Date总是返回当前时间。

2.Date(日期字符串|日期参数)构造函数
Date对象是一个构造函数,对它使用new命令,会返回一个Date对象的实例。

  • 如果不加参数,生成的就是代表当前时间的对象。
var date1 = new Date();
console.log(date1);//2021-10-21T03:44:11.152Z
  • 如果添加一个日期字符串作为参数,返回字符串所对应的时间
var date1 = new Date('2000-12-07');
console.log(date1);//2000-12-07T00:00:00.000Z

一些其他合法的日期字符串写法。

  1. new Date(datestring)
  2. new Date(“2013-2-15”)
  3. new Date(‘2013/2/15’)
  4. new Date(“2013-FEB-15”)
  5. new Date(“FEB, 15, 2013”)
  6. new Date(“FEB 15, 2013”)
  7. new Date(“Feberuary, 15, 2013”)
  8. new Date(“Feberuary 15, 2013”)
  9. new Date(“15, Feberuary, 2013”)
    10.Sun Jan 06 2013 00:00:00 GMT+0800 (中国标准时间)
  • 如果添加日期参数,返回字符串所对应的时间
    语法:
var date = new Date(year,month,day,hours,minutes,seconds,ms);

使用日期参数时,年月必须写,其他则默认和可以省略,省略为0。

日期运算

  1. 两个日期对象进行减法运算,返回的就是它们间隔的毫秒数。
  2. 两个日期对象进行加法运算,返回的就是连接后的两个字符串。

日期对象的get*系列方法

  • getTime():返回实例对象距离1970年1月1日00:00:00对应的毫秒数,等同于valueOf方法。
  • getDate():返回实例对象对应每个月的几号(从1开始)。
  • getDay():返回星期几,星期日为0,星期一为1,以此类推。
  • getYear():返回距离1900的年数。
  • getFullYear():返回四位的年份。
  • getMonth():返回月份(0表示1月,11表示12月)。
  • getHours():返回小时(0-23)。
  • getMilliseconds():返回毫秒(0-999)。
  • getMinutes():返回分钟(0-59)。
  • getSeconds():返回秒(0-59)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值