Giter VIP home page Giter VIP logo

javascript's Issues

前端知识总结-BOM和DOM

BOM:我们都知道JavaScript是运行在浏览器中的,所以javascript提供了一些列对象用于和浏览器窗口进行交互,这些对象主要包括window、document、location、navigator和screen等,通常统称为浏览器对象模型browser object model BOM

DOM:DOM是文档对象模型 document object model 当页面加载时,可以将结构文档在内存中转换成对象的树。DOM中常用三种节点:元素节点、文本节点、属性节点。

JavaScript获取昨天、今天、明天的时间

//昨天的时间
var day1 = new Date();
day1.setTime(day1.getTime()-24 * 60 * 60 * 1000);
var s1 = day1.getFullYear()+"-" + (day1.getMonth()+1) + "-" + day1.getDate();

//今天的时间
var day2 = new Date();
day2.setTime(day2.getTime());
var s2 = day2.getFullYear()+"-" + (day2.getMonth()+1) + "-" + day2.getDate();

//明天的时间
var day3 = new Date();
day3.setTime(day3.getTime()+24 * 60 * 60 * 1000);
var s3 = day3.getFullYear()+"-" + (day3.getMonth()+1) + "-" + day3.getDate();
console.log(s1,s2,s3);

js数据类型

基础类型的局部变量直接在栈中创建,被引用或拷贝时,会创建一个完全相等的变量;
引用类型局部变量存储在堆中,栈中只存储它的引用地址。多个引用指向同一个地址,这里会涉及一个共享的概念。

栈中存储的数据是轻量级的

let a  = {
    name:'Tom',
    age:20
}
function change(obj){
    obj.age = 24;
    obj = {
        name:'Jame',
        age:30
    }
    return obj
}
let b  = change(a)
console.log(b.age) // 30
console.log(a.age) // 24

数据类型判断方法
typeof 可以判断基础数据类型(null除外)但引用类型中除了function类型以外,其余无法判断
instanceOf 可以准确判断复杂引用数据类型,但不能判断基础数据类型

Object.prototype.toString

Object.prototype.toString.call(obj).replace(/^[object (\S+)]$/, '$1')

js面向对象

方法 所有属性 可枚举属性 包括原型属性 自身属性
Object.keys(obj)   ✔️   ✔️
for...in   ✔️ ✔️  
Object.getOwnPropertyNames() ✔️     ✔️

js6种创建类/对象的方法

// 第一种:对象  
var person = {};// 或者var obj = new Object();  
person.name = "king";  
person.age = 20;  
person.Introduce = function () {  
    alert("My name is " + this.name + ". My age is " + this.age);  
}; 
person.Introduce();  
  
// 第二种:json格式的对象  
var person = {  
    name: "king",  
    age: 20,  
    Introduce: function () {   
        alert("My name is " + this.name + ". My age is " + this.age);   
    }  
};  
person.Introduce();   
alert(person.name);// king  
  
// 第三种(1):类,类似于默认构造函数  
var Person = function () {  
    this.name = "king";  
    this.age = 20;  
    this.Introduce = function () {  
        alert("My name is " + this.name + ". My age is " + this.age);  
    };  
};  
var person = new Person();// 或者var person = Person();  
person.Introduce();  
alert(person.name);// 输出:king  
alert(person["name"]);// 也可以使用json的访问方式,说明使用function定义类与第二种是等效的  
alert(person.age);// 输出:20  
  
// 第三种(2):区别仅在于第一行的声明  
function Person () {  
    this.name = "king";  
    this.age = 20;  
    this.Introduce = function () {  
        alert("My name is " + this.name + ". My age is " + this.age);  
    };  
};  
var person = new Person();  
person.Introduce();  
alert(person.name);// 输出:king  
alert(person.age);// 输出:20  
  
// 第四种(1):可定制的类,类似构造函数  
var Person = function (name, age) {  
    this.name = name;  
    this.age = age;  
    this.Introduce = function () {  
        alert("My name is " + this.name + ". My age is " + this.age);  
    };  
};  
var person = new Person("king", 20);  
person.Introduce();  
alert(person.name);// 输出:king  
alert(person.age);// 输出:20  
  
// 第四种(2):  
function Person (name, age) {  
    this.name = name;  
    this.age = age;  
    this.Introduce = function () {  
        alert("My name is " + this.name + ". My age is " + this.age);  
    };  
};  
var person = new Person("king", 20);  
person.Introduce();  
alert(person.name);// 输出:king  
alert(person.age);// 输出:20  
  
// 第五种:变量的封装,将其改为私有。采用了闭包。  
// 在function中用this引用当前对象,通过对属性的赋值来声明属性。即this定义的为公有  
// 如果用var声明变量,则该变量为局部变量,只允许在类定义中调用。即var定义的为私有,不用var则为全局  
var Person = function (name, age) {  
    var name = name;  
    var age = age;  
    this.GetName = function () {  
        return name;  
    }  
    this.GetAge = function () {  
        return age;  
    }  
    this.Introduce = function () {  
        alert("My name is " + name + ". My age is " + age);  
    };  
};  
var person = new Person("king", 20);  
alert(person["name"]);// undefined  
alert(person.GetName());// king  
  
// 第五种(2):可参考第三种(2)和第四种(2)  
  
// 第六种(1):在函数体中创建一个对象(使用第二种),声明其属性再返回  
function Person() {  
    var obj =  
    {  
        'age':20,  
        'name':'king'  
    };  
    return obj;  
}  
var person = new Person();  
alert(person.age);// 输出:20  
alert(person.name);// 输出:king  
  
// 第六种(2):函数体内创建对象时使用第一种方法  
function Person() {  
    var obj = new Object();  
    obj.age = 20;  
    obj.name = 'king';  
    return obj;  
}  
var person = new Person();  
alert(person.age);// 输出:20  
alert(person.name);// 输出:king  

小结:上述第一种、第二种方法为直接创建一个对象字面量。第二种到第六种方法相当于提供了类,使用new操作符(可省略)创建对象实例。

原文 http://blog.csdn.net/kingzone_2008/article/details/8461307

js千位分隔符分割数字

最快捷的方式是使用正则表达式
String(123456789).replace(/(\d)(?=(\d{3})+$)/g, "$1,");
结果是:123,456,789

比较愚蠢的办法是 对数据拆分 取模(初次遇到这种问题就这么干的!!!记一笔 )

在node_modules下的package.json中运行脚本

track跟踪问题:

npx cross-env NODE_OPTIONS="--trace-warnings" npm run build

npm run build是执行脚本

如果你想一个子模块内运行一个命令,你可以使用explore命令,如解释在这里:

npm explore submodule -- npm run subscript

似乎yarn没有等效的命令,但是有一个cwd选项(尚未充分说明)可以让您选择工作目录:

yarn --cwd node_modules/submodule/ run subscript

nginx反向代理跨域请求头options问题

在项目中遇到一个问题,axios跨域请求的时候会先发一个options请求来验证可以使用的请求头,然后再发送真证的请求,服务器是使用的php开的的。。响应的options的请求代码如下

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Authorization,Access-Token, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE');
header("HTTP/1.0 200 OK");
exit(0);
}

直接返回头信息,不用输出内容。然后本地测试的时候就可以啦。。。于是上线到服务器使用,但是出问题啦。options这个请求老是报错也没有看到响应的上面设置的头信息,于是就调试输出看 $_SERVER['REQUEST_METHOD'] 到底输出什么东西,options请求服务器居然输出啦 GET 请求 ,然后才想到服务器里用啦 nginx 反向代理,

解决方法
在nginx中设置options的响应请求,配置如下

server {
listen 80;
server_name www.aaaaa.com;
location / {
if ( $request_method = 'OPTIONS' ) {
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Headers Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS,HEAD,PUT;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Headers X-Data-Type,X-Auth-Token;
return 200;
}
proxy_pass http://www.bbbi.com:8080;
index index.html index.php index.htm;
}
}

注意事项

跨域请求的时候options请求可以直接返回对应的跨域头后就结束脚本,当第二次请求真正的数据get/post请求返回时邮样要设置跨域的请求头,不然还会报错

js日期格式转换的几种方法探讨

提出问题: 如何将 2017年8月22日 转换成 2017-8-22 / 2017-08-22呢

'2017年8月22日'.replace(/[年月日]/g,'-');

'2017年8月22日'.match(/\d+/g).join('-')

'2017年8月22日'.replace(/[年月]/g,'-').replace('日','');

点评 第一种形式 返回的是

 2017-8-22-
 //这时我们可以通过字符串截取来处理
 '2017年8月22日'.replace(/[年月日]/g,'-').slice(0,-1);

上面日期 如果小于10,补0 ,则需要用如下方法

'2017年8月22日'.match(/\d+/g).map(n => +n < 10 ? '0'+n : n).join('-')

function format( str ) {
    var result = /^(\d+)年(\d+)月(\d+)日$/.exec(str)
    if( result ) {
        var y = result[ 1 ];
        var m = result[ 2 ];
        var d = result[ 3 ];
        m = Number( m ) < 10 ? '0' + m : m;
        d = Number( d ) < 10 ? '0' + d : d;
        return y + '-' + m + '-' + d;
    }
    return null;
}
console.log(format( '2017年8月22日'))

'2017年8月22日'.match(/\d{1,4}/g).join('-').replace(/\d+/g, function(d) {
   return (d.length > 1)? d : ('0' + d);
})
     
'2017年8月22日'.replace(/(\d+)日/, function(_d, d) {
   return (d.length == 2)? ('-' + d) : ('-0' + d);
}).replace(/(\d+)月/, function(_m, m) {
   return (m.length == 2)? ('-' + m) : ('-0' + m);
}).replace(/(\d+)年/, function(_y, y) {
   return y;
})
     
'2017年8月22日'.replace(/(\d+)[年,月,日]/g, function(_d,d) {
   return (d.length > 1) ? d.length == 4 ? d : ('-' + d) : ('-0' + d);
})

'2017年8月22日'.replace(/(\d{4})年(\d{1,2})月(\d{1,2})日/, (a,b,c,d)=>{
   return `${b}-${c>9?c:'0'+c}-${d}`
 })

根据对象的某一属性进行排序的js代码(如:name,age)

var data = [{
    name: "jiang",
    age: 22
  }, {
    name: "AAAAAAAAAAAAAA",
    age: 21
  }, {
    name: "CCCCCCCCc",
    age: 25
  }];
  //定义一个比较器
  function compare(propertyName) {
    return function(object1, object2) {
      var value1 = object1[propertyName];
      var value2 = object2[propertyName];
      if (value2 < value1) {
        return 1;
      } else if (value2 > value1) {
        return -1;
      } else {
        return 0;
      }
    }
  }
  //使用方法
  data.sort(compare("age"));
  console.log(data);

原文链接: http://www.cnblogs.com/woodk/p/5535756.html

shell 命令

shell脚本中$的多种用法($* 、 $@ 、$_ 、$# 、$$ 、$! 、 $? )

$0 脚本本身的名字
$1 脚本后所输入的第一串字符
$2 传递给该shell脚本的第二个参数
$_ 表示上一个命令的最后一个参数
$# 脚本后所输入的字符串个数
$$ 脚本运行的当前进程ID号
$* 脚本后所输入的所有字符"westos linux lyq"
$@ 脚本后所输入的所有字符’westos’ ‘linux’ ‘lyq’

运用
mkdir lerna-repo && cd $_
创建lerna-repo 文件夹 并进入当前文件夹

异步加载JS的4种方式

<!DOCTYPE html>
<html>
        <head>
            <script src="http://common.cnblogs.com/script/jquery.js" type="text/javascript"></script> 
            <script type="text/javascript">
                $(document).ready(function() {
                  alert("加载完成!");
                });
           </script>
        </head>
        <body>
             <img src="http://mpic.tiankong.com/8a7/fc2/8a7fc22d9b75d8b9950e990d6d960da2/640.jpg@360h" />
      </body>
</html>

点评:
1、需要引用jquery
2、兼容所有浏览器。

方案2:<script>标签的async="async"属性
async的定义和用法(是HTML5的属性)
async 属性规定一旦脚本可用,则会异步执行。
示例:
<script type="text/javascript" src="xxxxxxx.js" async="async"></script>
点评:
1、HTML5中新增的属性,Chrome、FF、IE9&IE9+均支持(IE6~8不支持)。此外,这种方法不能保证脚本按顺序执行。
2、async 属性仅适用于外部脚本(只有在使用 src 属性时)。

方案3:<script>标签的defer="defer"属性
defer 属性规定是否对脚本执行进行延迟,直到页面加载为止。
有的 javascript 脚本 document.write 方法来创建当前的文档内容,其他脚本就不一定是了。
如果您的脚本不会改变文档的内容,可将 defer 属性加入到 <script> 标签中,以便加快处理文档的速度。因为浏览器知道它将能够安全地读取文档的剩余部分而不用执行脚本,它将推迟对脚本的解释,直到文档已经显示给用户为止。
示例:

<script type="text/javascript" defer="defer"> 
alert(document.getElementById("p1").firstChild.nodeValue); 
</script> 

点评:兼容所有浏览器。此外,这种方法可以确保所有设置defer属性的脚本按顺序执行。

方案4:动态创建<script>标签
示例:

<!DOCTYPE html>
<html>
        <head>
                <script type="text/javascript">
                        (function(){
                                var s = document.createElement('script');
                                s.type = 'text/javascript';
                                s.src = "http://code.jquery.com/jquery-1.7.2.min.js";
                                var tmp = document.getElementsByTagName('script')[0];
                                tmp.parentNode.insertBefore(s, tmp);
                        })();
                </script>
        </head>
        <body>
                <img src="http://mpic.tiankong.com/8a7/fc2/8a7fc22d9b75d8b9950e990d6d960da2/640.jpg@360h" />
        </body>
</html>

点评:兼容所有浏览器。
推荐使用第一个方案。

原文 http://www.cnblogs.com/huangcong/p/3747038.html

== 和 === 有什么区别

=== 不需要进行类型转换,只有类型相同并且值相等时,才返回 true.

== 如果两者类型不同,首先需要进行类型转换。具体流程如下:

首先判断两者类型是否相同,如果相等,判断值是否相等.
如果类型不同,进行类型转换
判断比较的是否是 null 或者是 undefined, 如果是, 返回 true .
判断两者类型是否为 string 和 number, 如果是, 将字符串转换成 number
判断其中一方是否为 boolean, 如果是, 将 boolean 转为 number 再进行判断
判断其中一方是否为 object 且另一方为 string、number 或者 symbol , 如果是, 将 object 转为原始类型再进行判断

let person1 = {
    age: 25
}
let person2 = person1;
person2.gae = 20;
console.log(person1 === person2); //true,**注意复杂数据类型,比较的是引用地址**

思考: [] == ![]

我们来分析一下: [] == ![] 是true还是false?

首先,我们需要知道 ! 优先级是高于 == (更多运算符优先级可查看: 运算符优先级)
![] 引用类型转换成布尔值都是true,因此![]的是false
根据上面的比较步骤中的第五条,其中一方是 boolean,将 boolean 转为 number 再进行判断,false转换成 number,对应的值是 0.
根据上面比较步骤中的第六条,有一方是 number,那么将object也转换成Number,空数组转换成数字,对应的值是0.(空数组转换成数字,对应的值是0,如果数组中只有一个数字,那么转成number就是这个数字,其它情况,均为NaN)
0 == 0; 为true

js中的arguments用法

<script>
    //arguments对象并不是一个数组,但是访问单个参数的方式与访问数组元素的方式相同
    function show(){
        console.log(arguments); 
        //arguments.push(5);   //此时报错arguments.push is not a function
    }
    show(1,2,3,4);
    //在js中 不需要明确指出参数名,就能访问它们,例如:

    function test() {
        var s = "";
        for (var i = 0; i < arguments.length; i++) {
            alert(arguments[i]);
        }
    }
    test("name", "age");
    //arguments.callee引用函数自身。
    //callee 属性是 arguments 对象的一个成员,仅当相关函数正在执行时才可用。
    //callee 属性的初始值就是正被执行的 Function 对象,这允许匿名的递归函数。
    var sum = function (n) {
        if (n==1) {
            return 1;
        }else {
            return n + arguments.callee(n - 1);
        }
    }
    alert(sum(6));
    //总结:arguments此对象大多用来针对同个方法多处调用并且传递参数个数不一样时进行使用。根据arguments的索引来判断执行的方法。
</script>

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.