面试必备
编程题
颠倒字符串
var arr = "Holle Word"
//思路:
//1.用split("")方法把字符串变成数组,如果分隔符是 "",被返回的数组将是间隔单个字符的数组。
//2.再反转数组reverse()。
//3.再变回字符串join()
var newArr = arr.split("").reverse().join("");
console.log(newArr)
//dreW elloH
给定一个任意长度的字符串数组,返回重复出现次数最高的字符串(未解决)。
var arr = ["abc","sfg","gdd","abc","fff","abc"];
问答题
xss攻击
xss是使用javascript脚本注入攻击
解决方法:
使用转义解决将<转义为< >转义为>
使用过滤器,拦截所有请求,重写request
重写获取值的方法,将特殊代码转换成html
哪些数据是外部可以构造的?
coolie,POST参数,Referer,GET参数
答案:
js的基本数据类型有哪些?
Undefined,Null,Boolean,Number,String,还有ES6中的新增的Symbol类型,表示代表创建后独一无二且不可变的数据类型。
##6.如何将字符串转换为数字?
(1)使用Number()方法,前提是所包含的字符串不包含不合法字符。Number(“12.2b”)=NaN
(2)使用parseInt()方法,可以解析一个字符串,并返回一个整数。parseInt(“12.b2”)=12
(3)使用parseFloat()方法,该函数解析一个字符串参数并返回一个浮点数。parseFloat(“12.2b2b2b2”)=12.2
什么是DOM什么是BOM?
DOM指的是文档对象模型,它指的是把文档当作一个对象来对待,这个对象主要定义了处理网页内容的方法和接口。
BOM指的是浏览器对象模型,这个对象主要定义了与浏览器进行交互的法和接口。
构造函数与原型(必问的题目)
js规定,每一个构造函数都有一个prototype属性,指向另一个对象,注意这个prototype就是一个对象,这个对象的所有属性和方法都会被构造函数所拥有。
我们可以把那些不变的方法直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法,节省空间
function Star(name,age){
this.name = name;
htis.age = age;
//this.action = function() {
// console.log(‘踩蘑菇’)
//}
}
//用原型对象prototype创建共享方法
Star.prototype.action = function(){
console.log('踩蘑菇')
}
var uese1 = new Star('马里奥',18);
var uese2 = new Star('路易吉',17);
//console.log(mla.action === lyj.action)//false
//不是同一空间,开辟了两个空间,浪费内存
console.log(mla.action === lyj.action)//true
//调用了prototype里的方法,指向的的同一地址
构造函数有原型对象prototype,对象有__propt__指向构造函数的原型对象prototype,两者相等
调用方法查找规则:首先看user1对象身上是否有action这个方法,如果有,有因为有__proto__的存在就去构造函数原型对象prototype上找这个方法,如果构造函数里的原行星对象和外部的原型对象都有同一方法执行就近原则,先构造函数内部再外部原型再上级构成了原型链
问答
1.原型是什么?
一个对象,我们也成为prototype为原型对象
2.原型的作用是什么?
共享方法,一般公共属性放在构造函数里,公共方法放在原型对象上面
3.对象原型是什么?
每一个原型对象(prototype)都有一个对象原型( __ proto __ ,注意:前后都是两个下划线)指向构造函数的原型对象
constructor构造函数
对象原型__proto__和构造函数prototyep原型对象里都有一个属性constructor属性,我们称为构造函数,因为它指回构造函数本身,主要用于记录该对象引用哪个构造函数,它可以让原型对象重新指向原来的构造函数。
用法
function Star(name,age){
this.name = name;
htis.age = age;
}
//用原型对象prototype创建共享方法
Star.prototype = {
//如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的指回原来的构造函数
constructor: Star,
action: funciton(){
console.log(‘踩蘑菇)
}
}
var user = new Star('马里奥',18);
console.log(user.__proto__)
//此时是没有constructor属性的,应因为原型对象的方法是=赋值操作赋值的。
图解
原型链
只要是对象就有__ proto __,又因为原型对象也是对象,也有自己的 __ proto __ ,它指向的是Object原型对象 constructor 指向 Object 对象,再因为Object也是对象,也有 __ proto __,它指向的是 null (疯狂套娃…)
变量提升
- 在当前栈内存(作用域)形成,js代码从上往下执行之前,(浏览器)会把带有“var / function”关键词的进行提前申明或定义,这种预先处理机制称为 “变量提升”
- 声明:var a (默认值 undefined)
- 定义:a = 10 (就是赋值操作)
- 变量提升阶段:
- 带 var 的只声明未定义
- 带 function 的声明并赋值
什么是闭包?
闭包是指有权访问另一个函数作用域中 变量的函数----javascript高级程序设计
就是一个作用域可以访问另一个函数内的局部变量
js笔试题
1.对象key值的一些注意事项
//1.1
var a = {},
b = "123",
c = 123;
a[b] = "b";
a[c] = "c";
console.log(a[c])
//解析:
//a[b] = "b"; => a["123"] = "b"
//a[c] = "c"; => a[123] = "c"
//因为a["123"] = a[123], 所以 b 被 c 覆盖, 结果为:"c"
//1.2
var a = {},
b = Symbol("123"),
c = Symbol("123");
[b] = "b";
[c] = "c";
onsole.log(a[b]);
//解析:Symbol ES6语法,表示创建唯一值,Symbol("123") != Symbol("123"),返回结果为 ”b“
//typeof Symbol("123") 返回的是Symbol类型
//1.3
ar a = {},
b = { key: "123" },
c = { key: "456" };
[b] = "b";
[c] = "c";
cnsole.log(a[b]);
//解析:对象的属性名不能是对象(遇到对象属性名,默认转换成字符串)
//例如:obj = {} arr = {11,22} obj[arr] = 123 obj = {"11,22": 123}
//普通对象.toString(),调用的是Object.prototype上的方法(这个方法是用来检测数据类型的)
// obj={} obj.toString() => "[object object]"
//结果为:a["[object object]" : "b"] => a["object object" : "c"] ,打印 "c"
2.原型题
function Foo() {
Foo.a = function () {
console.log(1);
};
this.a = function () {
console.log(2);
};
}
Foo.prototype.a = function () {
console.log(3);
};
Foo.a = function () {
console.log(4);
};
Foo.a();
//把Foo当普通对象设置私有属性方法 => Foo.a()
let obj = new Foo();
obj.a();
//在Foo()函数里改变了外面的Foo.a的值为(1),this指向的是 obj 调用私有的方法返回结果为:obj.a = 2
Foo.a();
//此时的Foo.a之前重新被赋值为了 1
3.变量提升与作用域
console.log(a,b);
var a = 11,
b = 22;
function fn() {
console.log(a, b);
var a = b = 33;
console.log(a, b);
}
fn();
console.log(a, b);
解析: