javaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML网页上使用,用来给HTML网页增加动态功能。JavaScript兼容于ECMA标准,因此也称为ECMAScript。
强制:parseInt()、parseFloat()、Number()
隐式:== 、!、!!(!!a === (a!=null&&typeof(a)!=undefined&&a!=’’))
普通添加事件的方法不支持添加多个事件,最下面的事件会覆盖上面的,无法取消
事件绑定addEventListener方式添加事件可以添加多个,不兼容低版本IE
addEventLisntener还支持事件冒泡+事件捕获
// 普通添加事件的方法:
var btn = document.getElementById("hello");
btn.onclick = function(){
alert(1);
}
btn.onclick = function(){
alert(2);
}
执行上面的代码只会alert 2
// 事件绑定方式添加事件:
var btn = document.getElementById("hello");
btn.addEventListener("click",function(){
alert(1);
},false);
btn.addEventListener("click",function(){
alert(2);
},false);
执行上面的代码会先alert 1 再 alert 2
function A( age, name ){
this.age = age;
this.name = name;
}
A.prototype.show = function(){
alert('父级方法');
}
function B(age,name,job){
A.apply( this, arguments );
this.job = job;
}
B.prototype = new A();
var b = new A(14,'侠客行');
var a = new B(15,'狼侠','侠客');
console.log(b); // A {age: 14, name: "侠客行"}
console.log(a); // B {age: 15, name: "狼侠", job: "侠客"}
alert(typeof [1, 2]); //object
alert(typeof 'leipeng'); //string
alert(typeof 1); //number
var i = true; alert(typeof i); //boolean
var a; alert(typeof a); //undefined
function a(){;};
alert(typeof a) //function
事件冒泡:事件开始由最具体的元素接受,然后逐级向上传播
事件捕捉:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的
目标阶段
xxx.onclick = test
addEventListener(xxx, ‘click’, test)
第一种(函数声明):
function sum1(num1,num2){
return num1+num2;
}
第二种(函数表达式):
var sum2 = function(num1,num2){
return num1+num2;
}
第三种(函数对象方式):
var sum3 = new Function("num1","num2","return num1+num2");
var obj = {};(使用json创建对象)
var obj = new Object();(使用Object创建对象)
通过函数创建对象。
(1)、使用this关键字
如:
var obj = function (){
this.name ='张三';
this.age = 19;
this.action = function () {
alert('吃饭');
};
}
(2)、使用prototype关键字
如:function obj (){}
obj.prototype.name ='张三';
obj.prototype.action=function () {
alert('吃饭');
};
通过Window创建对象
window.name = ''张三';
window.age = 19;
window.action= function() {
alert('吃饭');
};
使用内置对象创建对象
var obj = new Object();//示例初始化一个Object
ReadOnly和Disabled的作用是使用户不能够更改表单域中的内容.
function escapeHtml(str) {
return str.replace(/[<>”&]/g, function(match) {
switch (match) {
case “<”:
return “<”;
case “>”:
return “>”;
case “&”:
return “&”;
case “\””:
return “"”;
}
});
}
function serilizeUrl(url) {
var urlObject = {};
if (/\?/.test(url)) {
var urlString = url.substring(url.indexOf("?") + 1);
var urlArray = urlString.split("&");
for (var i = 0, len = urlArray.length; i < len; i++) {
var urlItem = urlArray[i];
var item = urlItem.split("=");
urlObject[item[0]] = item[1];
}
return urlObject;
}
return null;
}
function combo(msg){
var arr=msg.split("-");
for(var i=1;i
var str = 'asdfssaaasasasasaa';
var json = {};
for (var i = 0; i < str.length; i++) {
if(!json[str.charAt(i)]){
json[str.charAt(i)] = 1;
}else{
json[str.charAt(i)]++;
}
};
var iMax = 0;
var iIndex = '';
for(var i in json){
if(json[i]>iMax){
iMax = json[i];
iIndex = i;
}
}
alert('出现次数最多的是:'+iIndex+'出现'+iMax+'次');
//思路:每遍历一次就和之前的所有做比较,不相等则放入新的数组中!
//这里用的原型 个人做法;
Array.prototype.unique = function(){
var len = this.length,
newArr = [],
flag = 1;
for(var i = 0; i < len; i++, flag = 1){
for(var j = 0; j < i; j++){
if(this[i] == this[j]){
flag = 0; //找到相同的数字后,不执行添加数据
}
}
flag ? newArr.push(this[i]) : '';
}
return newArr;
}
// 方法二
var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4];
Array.prototype.unique2 = function()
{
var n = []; //一个新的临时数组
for(var i = 0; i < this.length; i++) //遍历当前数组
{
//如果当前数组的第i已经保存进了临时数组,那么跳过,
//否则把当前项push到临时数组里面
if (n.indexOf(this[i]) == -1) n.push(this[i]);
}
return n;
}
var newArr2=arr.unique2(arr);
alert(newArr2); //输出1,2,3,4,5,6,9,25
① 例如 class=“font-自增的数字类型” font-1 font-2 font-3
class="font - + '(i-1)'+ "
② 例如 对于地址栏的拼接
url="http://www.example.com?params=' examId + ',' paperId + ',' + ${pagition} ' "
③ 例如
:style="[{'height': isFourStep == 1 ?'calc(100% - 20px)':(isFull == 1 ? 'calc(100% - 20px)':'calc(100% - 29px)')}]
场景:在一个函数外部想要获取函数内部的变量值,并且这个是始终保存在内存中,不会因为某个函数执行完变量被垃圾回收机制回收
var a = 1;
function out () {
var b = 2;
}
out();
console.log(a) // 1
console.log(b) // b is not defined 此时 在函数外部获取不到变量b
变量b是在函数内部声明的 在全局是无法获得的 报错 undefined,为了解决这一问题 我们可以使用闭包,简单来讲,闭包就是指一个函数,但是这个函数可以访问另外一个函数作用域中的变量
var a = 1;
function out () {
var b = 2;
// 闭包 获取到b 并且这个变量会存储在内存中
function inner() {
console.log('b',b); // 2
}
inner();
}
out();
console.log(a) // 1
var obj = {
name: 'Anna',
eat: function() {
// 当前eat函数中的this指向当前对象 obj 所以可以获取到this.name
console.log('this.name -- ',this.name); // Anna
console.log('this -- ',this); // {name:'Anna',eat:fn()}
return function() {
// 闭包函数中的this指向window 所有获取不到this.name
console.log('this.name',this.name); // 空
}
}
}
obj.eat()();
// 内存泄漏:当已经不需要某块内存时但是这块内存还存在着,并没有被垃圾回收机制清理掉,就会造成内存的泄漏
// 垃圾回收机制:1.标记清除(变量声明的方式) 2.引用计数(调用使用情况)
// 注意:闭包只是在ie9以前会造成内存泄漏 只是由于IE9 之前的版本对JScript对象和COM对象使用不同的垃圾收集,从而导致内存无法进行回收。
function show() {
var el = document.getElementById("div");
el.onclick = function() {
console.log(123);
}
}
show();
解决ie9以前闭包造成的内存泄漏 采用变量声明的方式 让垃圾回收机制自动回收
function show2() {
var el = document.getElementById("div");
var num = 123;
el.onclick = function() {
console.log(num);
}
}
show2();
function out() {
for(var i = 0; i < 10; i++) {
// 当前的闭包函数是在for循环内部 每一次循环都相当于对i重新赋值 所以打印的i是10.如果想要 0 1 2 3...9 的话 将循环放在闭包函数内部即可
function inner() {
console.log('i',i); // i 10
}
}
inner()
}
out();
①会造成内存泄漏,需要加以处理解决
②闭包中的变量都存储在内存中 对内存的消耗会很大 所以要谨慎使用闭包 避免内存消耗 影响网页性能
① 函数声明式
function abc() {
console.log(1);
}
abc() // 1
② 函数表达式
var Abc = function() {
console.log(2);
}
console.log(Abc); // ƒ abc() { console.log(2);}
Abc(); // 2
abc() // 1 在这里可以打印出来 函数提升
function abc() {
console.log(1);
}
abc() // 1
上述代码执行过程是将abc函数先整体提升到当前作用域的顶部
console.log(variable); // undefined
var variable = 123;
console.log(variable); // 123
上述代码的执行过程会有变量的提升,即var声明的变量在执行的过程中会先提升到当前作用域的顶部,如下:
var variable;
console.log(variable); // undefined
variable = 123;
console.log(variable); // 123
匿名函数又叫自执行函数,因为匿名,无法调用,不调用又没有意义,所以自执行,执行后就会被销毁
① console.log( // undefined
(function(){
console.log(1) // 1
})()
)
② console.log( // unfined
(function() {
console.log(2) // 2
}())
)
控制台打印结果如下 (执行完就被销毁,所以undefined):
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190709164933822.png)
① 在全局中 指向window
var name = "eee";
console.log(this.name) // 全局中 eee
② 在函数或者对象中独立调用时,指向window
var name = 'aaa';
function showName() {
name = 'bbb'
console.log(this); // window
console.log(this.name); // bbb 如果当前作用域存在就找当前作用域中的,没有则向函数外部去找(aaa)
}
showName();
③函数被当做某个对象的方法被调用时,指向当前对象
var obj = {
name: 'ccc',
eat: function() {
console.log(this); // 当前obj对象
name = 'ddd';
console.log(this.name); // ccc
}
};
obj.eat();
④ new关键字创建的构造函数对象 指向当前新函数对象
⑤ call和apply 当前传入的对象或者函数
split | 切割成数组的形式 |
---|---|
join | 数组转换成字符串 |
push | 数组尾部添加 |
pop() | 数组尾部删除 |
Unshift | 数组头部添加 |
shift | 数组头部删除 |
obj.appendChid() | 添加某个节点 |
obj.insertBefore() | 插入某个节点 |
obj.replaceChild() | 替换某个节点 |
obj.removeChild() | 删除某个节点 |
reverse | 数组倒排 |
sort | 数组降序排 |
new Date() | YYYY-MM-DD格式日期 |
getFullYear()/getMonth() /getDate() | 获取年/月/日份 |
createDocumentFragment() | 创建一个dom片段 |
createElement() | 创建一个具体的元素 |
createTextNode() | 创建一个文本节点 |
getElementsByTagName() | 通过标签名称 |
getElementsByName() | 通过元素的Name属性的值 |
getElementById() | 通过元素Id,唯一性 |
trim() | 去除字符串的头尾空格 |
document.write | 只能重绘整个页面 |
document.innerHTML | 可以重绘页面的一部分 |