精华内容
下载资源
问答
  • 定义了一个变量b,把右侧的运算结果3赋值给左侧的变量b 3.3 变量的关联 在JS中,一个变量只能关联一个值,但是一个值却可以关联多个变量 3.4 执行过程 let a = 12; 它的执行过程是:先创建一个值是12,放在栈内存中...

    791a58725c628e9e8336809c0ec6ac9b.png

    代码在执行过程中都干了哪些事(增加面试分的知识)

    a8a781100ac98ea8d1a4e2650b6bc4b8.png

    1. 开胃题

    let a = 12;
    let b = a;
    b = 13;
    console.log(a);
    -----------------
    let a = {n: 12};
    let b = a;
    b['n'] = 13;
    console.log(a.n);
    -----------------
    let a = {n: 12};
    let b = a;
    b = {n: 13};
    console.log(a.n);
    
    ❝ 当你看到上面这三个题的时候,可能会立马说出输出的结果,但是对于它的执行过程中开辟那些内存,以及其中值发生的变化真的清楚吗?下面以这三个题来作为今天的开场白,咱们一起来聊聊JS代码在执行过程中的一系列过程:

    2.JS代码执行中遇到的几个‘词’

    「执行环境栈内存ECStack:」 浏览器加载页面的时候,想让代码执行,首先会形成一个栈内存(执行环境栈);然后开始让代码准备执行; 「堆内存Heap」 :存储在执行过程中引用数据类型的值:对象存储的是键值对;函数存储的是字符串 「全局执行上下文EC(G):」 最开始要执行的一定是全局下的代码,此时会形成一个全局代码的执行环境(全局上下文EC(G)),把EC(G)压缩到栈内存中去执行(进栈操作);每一个函数的执行也是这样的操作;

    有些上下文在代码执行完成后,会从栈内存中移除去(出栈操作),但是有些情况是不能移除去的(例如:全局上下文就不能移出去);
    在下一次有新的执行上下文进栈的时候,会把之前没有移出去的都放栈内存的底部,让最新要执行的在顶部执行; 「GO全局对象=>window:」 在全局下使用var、function声明的变量会在全局对象window中也存储一份,并且建立映射机制(一边的值改变另一边值也改变); 「全局变量存储值对象VO(G):」 把在全局下声明的变量存储在VO(G)中;

    「私有变量存储值对象AO(XX):」 当形成私有作用域时,私有变量对象存储在AO(XX)中

    3. 结合图片理解开胃题中的执行过程

    3.1 基本数据类型值和引用数据类型值的区别

    JS中的数据类型目前有两大类:「基本数据类型」「引用数据类型」,他们有什么区别呢?

    基本数据类型包括number、string、Boolean、null、undefined、symbol、bigint......;他们都是把值存储在栈内存中的,操作的是值;

    引用数据类型包括对象(普通对象、数组对象、正则对象、函数对象、日期对象......) 和 函数;他们都是把值存储在堆内存中,然后把堆内存的地址存储在栈内存中,后期操作的是都是堆内存的地址;

    3.2 '='

    JS中的'='不像数学函数中的'='那样,它是把「右侧的结果(如果是一个表达式或者自执行函数等都是先计算它的结果)」 赋值 「给左侧的变量」

    例如:let a = 1; 就是定义了一个变量a,并且把右侧的1赋值给左侧的变量a

    例如: let b = 1+2; 定义了一个变量b,把右侧的运算结果3赋值给左侧的变量b

    3.3 变量的关联

    在JS中,一个变量只能关联一个值,但是一个值却可以关联多个变量

    2e8d3e1534b1e6b4b940e573922ed690.png

    3.4 执行过程

    let a = 12; 它的执行过程是:先创建一个值是12,放在栈内存中;然后再创建一个变量a;最后把两个关联起来;

    3.5 开胃题讲解

    结合上面的知识来分析一下开胃题

    • 首先浏览器会先开辟一个供代码执行的栈内存
    • 在栈内存中开辟一个全局代码执行的环境EC(G),让代码在这个作用域中一步步的执行
    let a = 12;
    let b = a;
    b = 13;
    console.log(a);
    -----------------
    let a = {n: 12};
    let b = a;
    b['n'] = 13;//先创建值13存储在栈内存中,然后让b执行的堆内存中的n这个属性改为13
    console.log(a.n);
    -----------------
    let a = {n: 12};
    let b = a;
    b = {n: 13}; //先创建一个堆内存用来存储值,然后把堆内存的地址存储在栈内存中和变量关联,因为b这个变量只能指向一个值,因此此时b的指向就改为`n:13`的这个堆内存
    console.log(a.n);
    

    5129c4212b50985cb20e91e09e52b829.png

    4. 变量提升

    「变量提升」是在当前执行上下文中(不管是全局的还是函数执行私有的),JS代码自上而下执行之前,都是先把带varfunction 的进行变量提升;而letconst等没有变量提升机制;

    var:会进行提前声明,并且会把声明的变量存储在GO全局变量对象中,之后会存在映射机制; function :会进行提前声明+定义,但是如果function出现在if/for等这些大括号内只会提前声明,并不会定义;

    5. var let function const 这四者的区别

    1. varfunction会进行变量提升,而letconst没有变量提升机制;
    2. varfunction声明的变量在定义之前可以使用,而letconst声明的变量在声明之前不能使用;
    3. 在全局执行上下文中使用varfunction声明的变量会向window中也映射一份,而letconst不会;
    4. typeof检测数据类型的时候有一个‘暂时性死区’的问题:如果没有定义这个变量 返回结果是undefined,而不是报错;但是在使用letconst声明这个变量之前使用typeof检测会报错;
    5. if/for这样的大括号内,如果有使用let或者const定义的变量,那么它就是私有的,会存放在if/for这个块作用域中;
    6. 使用const定义的某些值是可以修改的。当const定义基本数据类型的时候不可以修改;但是const定义的是引用数据类型,那么就可以修改它执行的这个堆内存中的内容,此时并没有修改const这个变量的指向。
    const a = 10;  //这里a是不可以修改,如果修改会报错
    const obj = {age:21};
    obj = [10,20];     //这是不可以修改的,如果修改会改变他的指向,因此会报错
    obj.age = 22;      //这是可以修改的,他修改的是obj指向的堆内存中的值,并没有改变obj的指向
    

    6. 作用域 与 作用域链

    6.1 作用域链的形成

    在某一个上下文中创建函数,除了开辟堆内存和赋值之外,还多做了一件事情‘给当前函数设置作用域链[[scope]] = 当前函数创建时候所在的上下文’

    6.2 作用域链的查找机制

    在当前上下文中,代码执行过程中遇到一个变量,首先看它是否为私有的

    • 如果是私有的,接下来的所有操作,都是操作自己的,和别人没有关系
    • 如果不是私有的,则按照scopeChain作用域链进行操作,在哪个上下文这个找到,当前变量就是谁的...一直找到全局上下文为止
      • 如果找到EC(G)都找不到:如果是获取变量值就会报错,如果是设置值,相当于给GO加属性

    7. 函数的执行过程

    「创建函数」

    • 在变量提升过程中,如果有带function的,直接定义加创建(自执行函数和函数表达式以及if/for内的除外)
    • 形成自己的作用域:[[scope]] = EC(XX);

    「执行函数」

    • 开辟一个私有的上下文
    • 进栈执行
      • 初始化作用域链 [[scope-chain]] = <当前上下文,上级上下文>
      • 初始化this
      • 初始化arguments = {0:1,1:2,length:2}
      • 形参赋值,分别给每个形参赋值
      • 变量提升:var 和 function
      • 代码执行
      • 是否销毁上下文 :如果外面有占用则不销毁,如果没有执行完就立即销毁

    8. 检测成果

    ❝ 下面这个题就是结合了变量提升、函数执行等的一道题目,我把解题的思路使用画图的方式展示出来了,如果还是有不明白的地方,可以在下方的讨论去交流
    var x=5,
        y=6;
    function func(){
        x+=y;
        func=function(y){
          console.log(y + (--x));
        };
        console.log(x, y);
    }
    func(4);
    func(3);
    console.log(x, y);
    

    c2c7261e1b2da8307940037fc203bc00.png

    9. 总结

    上面关于JS中的变量提升是JS语言中需要攻克的四座大山之一,是我们之后在写程序时候快速解决BUG的基础知识之一。如果在面试过程中,可以把代码每一步的执行过程都说出来,那也是一个加分项。加油

    展开全文
  • lianjiao               function ok(){ var date = document.getElementById("data").value; date+="-01"; AddMonths(date,1); ...function AddMonths(date,val
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
     <head>
      <title> lianjiao </title>
      <meta name="Generator" content="EditPlus">
      <meta name="Author" content="">
      <meta name="Keywords" content="">
      <meta name="Description" content="">
     </head>

     <body>
     

    <input id="data" type="text" ></input>
    <input type="button" value="ok" οnclick="ok()"></input>

    <script>

    function ok(){
    var date = document.getElementById("data").value;
    date+="-01";
    AddMonths(date,1);


    }
    // add Month
    function AddMonths(date,value)
    {
    var date1 = getDate(date);
    date1.setMonth(date1.getMonth()+value);
    alert(date1.format('yyyy-MM'));

    }

    //string to date
     function getDate(strDate) {
                var date = eval('new Date(' + strDate.replace(/\d+(?=-[^-]+$)/,
                 function (a) { return parseInt(a, 10) - 1; }).match(/\d+/g) + ')');
                return date;
            }

    //fomate
    Date.prototype.format = function(format)  
    {  
        var o =  
        {  
            "M+" : this.getMonth()+1, //month  
            "d+" : this.getDate(),    //day  
            "h+" : this.getHours(),   //hour  
            "m+" : this.getMinutes(), //minute  
            "s+" : this.getSeconds(), //second  
            "q+" : Math.floor((this.getMonth()+3)/3),  //quarter  
            "S" : this.getMilliseconds() //millisecond  
        }  
        if(/(y+)/.test(format))  
        format=format.replace(RegExp.$1,(this.getFullYear()+"").substr(4 - RegExp.$1.length));  
        for(var k in o)  
        if(new RegExp("("+ k +")").test(format))  
        format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));  
        return format;  
    }  
    </script>

     </body>
    </html>


    展开全文
  • 如题,开始查了查js的使用文档,但没发现可以直接用的函数,于是就想自己写函数来着,这就要涉及到每个月天数的判断,如果是2月份的话,还要涉及到闰年的判断,虽然不复杂但我想js应该不会这么低级,于是查了下资料...

    如题,开始查了查js的使用文档,但没发现可以直接用的函数,于是就想自己写函数来着,这就要涉及到每个月天数的判断,如果是2月份的话,还要涉及到闰年的判断,虽然不复杂但我想js应该不会这么低级,于是查了下资料,终于有了如下重大发现,以在某个日期上加减天数来说,其实只要调用Date对象的setDate()函数就可以了,具体方法如下:

    function addDate(date,days){

    var d=new Date(date);

    d.setDate(d.getDate()+days);

    var m=d.getMonth()+1;

    return d.getFullYear()+'-'+m+'-'+d.getDate();

    }

    其中,date参数是要进行加减的日期,days参数是要加减的天数,如果往前算就传入负数,往后算就传入正数,如果是要进行月份的加减,就调用setMonth()和getMonth()就可以了,需要注意的是返回的月份是从0开始计算的,也就是说返回的月份要比实际月份少一个月,因此要相应的加上1。

    http://www.my97.net/dp/demo/index.htm

    http://www.jb51.net/article/22657.htm

    http://www.cnblogs.com/ATree/archive/2011/06/29/JS-JavaScript-Date-Format.html

    展开全文
  • 想自己写一个日期减方法,但是涉及到每个月天数的判断,如果是2月份的话,还要涉及到闰年的判断,有些复杂,其实只要调用Date对象的setDate()函数就可以了,具体方法如下:function addDate(date,days){var d=...

    想自己写一个日期的加减方法,但是涉及到每个月天数的判断,如果是2月份的话,还要涉及到闰年的判断,有些复杂,其实只要调用Date对象的setDate()函数就可以了,具体方法如下:

    function addDate(date,days){

    var d=new Date(date);

    d.setDate(d.getDate()+days);

    var month=d.getMonth()+1;

    var day = d.getDate();

    if(month<10){

    month = "0"+month;

    }

    if(day<10){

    day = "0"+day;

    }

    var val = d.getFullYear()+""+month+""+day;

    return val;

    }

    $("#loadSource").bind("click", function(e) {

    //alert("sssss");

    var startTime = $("#start").val();

    var endTime = $("#end").val();

    endTime = addDate(endTime,1);

    //console.log(endTime);

    $(this).find("a").attr("href", "../../api/count/exportResourceExcel?startTime=" + startTime + "&endTime=" + endTime + "");

    //$(this).find("a").trigger("click");

    });

    其中,date参数是要进行加减的日期,格式YYYY-MM-DD,days参数是要加减的天数,如果往前算就传入负数,往后算就传入正数,如果是要进行月份的加减,就调用setMonth()和getMonth()就可以了,需要注意的是返回的月份是从0开始计算的,也就是说返回的月份要比实际月份少一个月,因此要相应的加上1。

    特别:注意年月日组合的时候,不能直接+,会当做int类型求和,要转换成字符串。

    展开全文
  • js 获取前一个月日期

    千次阅读 2017-07-18 10:47:17
    js 获取前一个月日期详细注解<!DOCTYPE html> <title></title> <script src="http://libs.baidu.co
  • Date本来就有setDate()的方法 ,用getDate()出来的数值+1就是加1天 如果大于本月最大天数会自动往下加一个月的 如: var now = new Date(); now = now.setDate(now.getDate()+1);  alert(now....
  • 获取时间段的方法 ...如:获取上一月到当前日期的时间 let date = new Date("2019-10-31") // 假装是当前日期... date.setMonth(date.getMonth()-1) date.toLocaleDateString() // > "2019...
  • js月份,日期加一

    2019-10-03 12:55:18
    js没有直接可以用的函数,所以只能自己写,其中需要涉及到每个月天数的判断,如果是2月份的话,还要涉及到闰年的判断 1 var addDate = { 2 //日期,在原有日期基础上,增加days天数,默认增加1天 3 setDate:...
  • 假设当前日期2018-01-10,获取一个月前的当前日期2017-12-10 function theDataBeforeOneMonth(){  //获取当前日期、时间  var date = new Date();  //获取当前年份,注意要引号,否则组合结果是非日期...
  • 日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() + ...
  • JS日期

    千次阅读 2018-03-15 22:49:19
    如果自己去算的话要花费不少功夫,要考虑月份、年份、甚至2的话还有闰年,于是查阅资料,发现js有现成的日期加减计算。JS的Date对象有四种创建方式:var d = new Date(); //直接获得当前日期 var d = new Date...
  • JS日期加减,日期运算

    2013-11-28 13:47:59
    日期减去天数等于第二个日期function cc(dd,dadd)...{//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth()...
  • 前言概述本文介绍项目中常用到的日期格式--日历(总是显示一个月有效期选择),该实例分显示页面和日期组件页面两个页面:实现过程一、日期组件页面1. 先实现页面效果,文件*.wxml和*.wxss代码如下:1)需求只需要显示...
  • JS判断一个日期是这一年的第几天

    千次阅读 2020-02-25 22:23:33
    使用JS判断一个日期是这一年的第几天。 首先我们先整理一下思路: 假如是1211日,那么我们需要将1-11的天数起来,然后加上12的11天。 假如是19日,那么我们只需要将1的这九天就可以了。 那么这样的...
  • JS日期、月份的

    2018-05-21 15:30:00
    需要注意的是返回的月份是从0开始计算的,也就是说返回的月份要比实际月份少一个月,因此要相应的加上1 // 日期,在原有日期基础上,增加days天数,默认增加1天 function addDate(date, days) { if (days == ...
  • js实现日期

    2020-05-25 20:12:23
    想要实现一个利用js的Date对象日期的方法,如果按照下图的写法,就会有很大的问题,因为涉及到每个月天数的判断,改变天是否应该改变月,月的改变是否引起年的变化,太复杂了吧,这里涉及到联动改变的问题,如下...
  • js日期不满足的情况下就会自动1个月,比如在当前时间为3月31号,传入1,1两个参数,预期结果为2月29日,但是结果输出了3月2日。就是如果不满就会溢出到下个月,后来看了api发现了setMonth有两个方法,另外一个...
  • 代码示例如下:(以当前日期new Date()为例。也可以将例中new Date()换成任意Date对象)1.获取今天的0时0分0秒(常用于开始日期的获取)var startDate= new Date(new Date()....获取一个月前的日期var lastM...
  • js日期天数1

    万次阅读 2016-08-03 14:38:53
    工作中经常会遇到当前日期+1或者+n的需求 举例子:比如现在时间是2016-08-30, 需要显示的是30+1或者是30+n。+1是31号正常,+2呢?话说本尊不晓得哪个月份有32号...当然年中也不会有13 下面说一下我用的两种方法
  • JS 日期加减计算天数 ヤッハロー、Kaiqisanすうう、一つふつうの学生プログラマである,接上节的内容,这次讲讲如何对时间对象内容进行修改网上已经有铺天盖地的方法,今天给大伙手写一个不一样的方法! 这次的方法...
  • var date = new Date(2018,0,7)//新建一个时间,用于表示2018年17日。 为什么用0表示1呢,这是...例1:加一个具体时间-> x年yz日 temp.setFullYear(temp.getFullYear() + x);//注意是FullYear temp.setMonth(t
  • js日期进行减操作

    千次阅读 2014-09-18 17:40:16
    涉及到每个月天数的判断,如果是2月份的话,还要涉及到闰年的判断,虽然不复杂但我想js应该不会这么低级,于是查了下资料,终于有了如下重大发现,以在某个日期减天数来说,其实只要调用Date对象的setDate()...
  • 1.获取两个日期时间相隔多少天 ...2.当前时间加一天 moment().add(1, 'days'); 3.当前时间减一天 moment().subtract(1, 'days'); 4.类型列表 years(y):年 quarters(Q):季度 months(M): weeks...
  • 行上个月日期显示 : 上月天数显示开始值 = 计算上个月的天数 – 这个月开始的第天在星期几的值 -1,然后在第行上月天数显示开始值自。 3:利用JS的事件冒泡获取li的innerHTML显示出对应日期 效果图: ...
  • 想自己写一个日期减方法,但是涉及到每个月天数的判断,如果是2月份的话,还要涉及到闰年的判断,有些复杂,其实只要调用Date对象的setDate()函数就可以了,具体方法如下: function addDate(date,days){ ...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 148
精华内容 59
关键字:

js日期加一个月