一天10个JS面试题(一)

目录
1、this指向?
2、map和forEach的区别?
3、递归实现的底层原理是什么?
4、JavaScript 的基本类型有哪些?引用类型有哪些?null 和 undefined 的区别?
5、如何判断 JavaScript 的数据类型?
6、创建对象有几种方法?
7、创建函数的几种方式 ?
8、=== 和 ==的区别?
9、请指出 JavaScript 宿主对象和原生对象的区别?
10、]avaScript 内置的常用对象有哪些?并列举该对象常用的方法?

1、this指向?

this 在 JavaScript 中的指向规则取决于函数调用的方式:

  • 全局环境:指向全局对象(浏览器中为 window,Node.js 中为 global)。
  • 普通函数调用:指向全局对象(严格模式下为 undefined)。
  • 方法调用:指向调用方法的对象。
  • 构造函数调用:指向新创建的实例对象。
  • 箭头函数:没有自己的 this,继承自定义时所在的上下文。
  • 显式绑定:通过 call、apply 和 bind 方法显式绑定 this。
  • 事件处理函数:指向绑定事件的 DOM 元素。

this 关键字在 JavaScript 中的指向是动态的,它的值在函数调用时确定,而不是在函数定义时确定。理解 this 的指向对于编写和调试 JavaScript 代码非常重要。以下是详细的解释,包含了不同情况下 this 的指向:

全局环境

在全局环境中,this 通常指向全局对象。在浏览器中,全局对象是 window,在 Node.js 中是 global。

console.log(this); // 在浏览器中输出: window

函数调用

在普通函数调用中,this 默认指向全局对象(在严格模式下为 undefined)。

function foo() { console.log(this); } foo(); // 在非严格模式下输出:

 window // 在严格模式下输出: undefined

方法调用

当一个函数作为对象的方法调用时,this 指向调用该方法的对象。

const obj = { name: 'Alice', greet: function() { console.log(this.name); } }; 

obj.greet(); // 输出: 'Alice'

构造函数调用

当使用 new 关键字调用构造函数时,this 指向新创建的实例对象。

function Person(name) { this.name = name; } 

const alice = new Person('Alice'); 

console.log(alice.name); // 输出: 'Alice'

箭头函数

箭头函数中的 this 绑定在定义时确定,而不是调用时确定。箭头函数没有自己的 this,它会捕获其所在的上下文的 this 值。

const obj = { name: 'Alice', greet: () => { console.log(this.name); } }; 

obj.greet(); // 输出: undefined(箭头函数中的 `this` 指向全局对象)

显式绑定

通过 call、apply 和 bind 方法可以显式地绑定 this。

  • call:传入的第一个参数作为 this。
function greet() { console.log(this.name); } 

const obj = { name: 'Alice' }; 

greet.call(obj); // 输出: 'Alice'
  • apply:与 call 类似,区别在于接受参数为数组。
greet.apply(obj); // 输出: 'Alice'
  • bind:返回一个新的函数,永久绑定 this。
const greetAlice = greet.bind(obj); 

greetAlice(); // 输出: 'Alice'

DOM 事件处理函数

在事件处理函数中,this 指向绑定事件的元素。

const button = document.querySelector('button'); 

    button.addEventListener('click', function() { 

    console.log(this); // 输出: <button> 元素 

});

作为对象的方法调用(链式调用)

当方法以对象的方法形式链式调用时,this 指向调用方法的对象。

const obj = { 


        name: 'Alice', greet: function() { console.log(this.name); 


        return this;


     }, farewell: function() { 


        console.log('Goodbye ' + this.name); return this; } 


        }; 

 
        obj.greet().farewell(); // 输出: // Alice // Goodbye Alice

2、map和forEach的区别?

主要区别

返回值: forEach:没有返回值(即 undefined) map:返回一个新数组。

用途: forEach:用于执行副作用,如修改数组、打印日志等。map:用于创建一个新数组,其中包含对每个原始数组元素应用提供的函数后的结果。

可链式调用:forEach:不能进行链式调用,因为没有返回数组。 map:可以进行链式调用,因为返回的是一个新数组

forEach

forEach 方法用于遍历数组中的每个元素,并对每个元素执行提供的函数。forEach 不会返回任何值,只是执行所提供的函数。

特点

  • 用法:对数组的每个元素执行一次提供的函数。
  • 返回值:undefined。
  • 可链式调用:不能进行链式调用,因为它不返回数组。
  • 用途:用于在遍历数组时执行副作用(如修改元素、输出日志等)。

示例

const numbers = [1, 2, 3, 4, 5]; 

numbers.forEach(function(number) { 

    console.log(number); // 输出数组中的每个元素 

}); // 修改数组元素 

numbers.forEach(function(number, index, array) { array[index] = number * 2; }); 

console.log(numbers); // 输出: [2, 4, 6, 8, 10]

map

map 方法也用于遍历数组中的每个元素,但它会创建一个新数组,其中包含对每个原始数组元素执行提供的函数后的结果。map 返回一个新的数组,原数组保持不变。

特点

  • 用法:对数组的每个元素执行一次提供的函数,并返回一个新数组。
  • 返回值:一个新数组,其中包含每个元素执行提供的函数后的结果。
  • 可链式调用:可以进行链式调用,因为它返回的是一个新数组。
  • 用途:用于创建一个对原数组的每个元素执行函数后的新数组。

示例

const numbers = [1, 2, 3, 4, 5]; 

const doubledNumbers = numbers.map(function(number) { return number * 2; }); 

console.log(doubledNumbers); // 输出: [2, 4, 6, 8, 10] 

console.log(numbers); // 输出: [1, 2, 3, 4, 5](原数组不变)

3、递归实现的底层原理是什么?

递归的底层原理依赖于函数调用栈来管理每次递归调用的执行上下文。每次递归调用都会将新的上下文压入栈中,直到满足基准条件。然后函数逐层返回,栈中的上下文逐个弹出,最终返回到最初的调用者。理解这一过程对于编写和调试递归函数非常重要。

递归的基本原理

  1. 基准条件(Base Case):- 基准条件是递归函数停止调用自身的条件。当满足这个条件时,递归函数会返回一个明确的结果,不再继续递归调用。
  2. 递归步骤(Recursive Step):- 递归步骤是函数在每次调用中调用自身,以逐步缩小问题的规模,直到达到基准条件。

函数调用栈

递归函数的执行依赖于函数调用栈(call stack),这是一个用于存储函数调用信息的数据结构。每次函数被调用时,其执行上下文(包括参数、本地变量、返回地址等)被推入栈中。当函数返回时,执行上下文被弹出栈,并返回到调用该函数的位置。

递归执行过程

1. 函数调用

每次递归调用时,都会在调用栈上创建一个新的栈帧,保存当前函数的执行上下文。栈帧会保留函数的参数和局部变量。

2. 基准条件检查

函数会首先检查基准条件,如果满足基准条件,则返回结果并从调用栈中弹出当前栈帧。

3. 递归调用

如果不满足基准条件,函数会进行递归调用。递归调用会创建新的栈帧并压入调用栈。

4. 返回结果

递归调用逐层返回结果,每次递归调用结束后,栈帧从调用栈中弹出,直到最终结果返回给最初的调用者。

示例:计算阶乘

以下是一个递归计算阶乘的示例:

function factorial(n) { // 基准条件 if (n === 0) { return 1; } // 递归步骤 

return n * factorial(n - 1); } 

console.log(factorial(5)); // 输出: 120

4、JavaScript 的基本类型有哪些?引用类型有哪些?null 和 undefined 的区别?
  • 基本类型:Number, String, Boolean, Null, Undefined, Symbol, BigInt
  • 引用类型:Object(包括 Array, Function, Date, RegExp, Map, Set 等)

null 和 undefined 都表示缺少值,但 undefined 是表示变量未赋值或属性不存在,而 null 是用来表示空对象引用,通常用于手动赋值,明确表示变量不再指向任何对象。

基本类型(Primitive Types)

基本类型是按值访问的,直接存储在变量中的数据。JavaScript 中有 7 种基本类型:

  1. Number:表示数值,包括整数和浮点数。
let num = 42; 

let pi = 3.14;
  1. String:表示字符串,即文本数据。
let str = "Hello, world!";
  1. Boolean:表示布尔值,true 或 false。
let isTrue = true; 

let isFalse = false;
  1. Null:表示空值,即没有对象。
let empty = null;
  1. Undefined:表示未定义的值,即变量已声明但尚未赋值。
let notAssigned;
  1. Symbol(ES6 引入):表示唯一且不可变的值,通常用作对象属性的标识符。
let sym = Symbol("description");
  1. BigInt(ES2020 引入):表示任意精度的整数。
let bigInt = 1234567890123456789012345678901234567890n;

引用类型(Reference Types)

引用类型是按引用访问的,存储在堆中的对象,通过引用(指针)来访问这些对象。主要包括:

  1. Object:基本的对象类型,用于存储键值对。
let obj = { name: "Alice", age: 25 };
  1. Array:用于存储有序集合的对象。
let arr = [1, 2, 3, 4, 5];
  1. Function:可调用的对象。
function greet() { console.log("Hello!"); }
  1. Date:用于处理日期和时间的对象。
let now = new Date();
  1. RegExp:正则表达式对象,用于匹配文本。
let regex = /ab+c/;
  1. Map:键值对的集合,键可以是任意类型。
let map = new Map(); map.set('key', 'value');
  1. Set:值的集合,值是唯一的。
let set = new Set([1, 2, 3]);

null 和 undefined 的区别

null 和 undefined 都表示“无值”或“缺失的值”,但它们有一些重要的区别:

  • undefined:表示变量已声明但尚未赋值,或对象属性不存在,或函数没有返回值。
let a; 

console.log(a); // 输出: undefined 

let obj = {}; 

console.log(obj.prop); // 输出: undefined 

function foo() {} 

console.log(foo()); // 输出: undefined
  • null:表示一个变量明确地赋值为空值,表示变量不再指向任何对象。
let b = null; 

console.log(b); // 输出: null 

let obj = { prop: null }; 

console.log(obj.prop); // 输出: null

比较 null 和 undefined

  • 类型:
console.log(typeof null); // 输出: "object"(这是一个长期存在的语言特性) 

console.log(typeof undefined); // 输出: "undefined"
  • 相等性:
console.log(null == undefined); // 输出: true(它们在非严格相等比较中被认为是相等的) 

console.log(null === undefined); // 输出: false(在严格相等比较中它们是不同的)

5、如何判断 JavaScript 的数据类型?
  • 基本类型:使用 typeof 判断。
  • 数组:使用 Array.isArray 判断。
  • 对象类型:使用 instanceof 判断特定的构造函数。
  • 更精确的判断:使用 Object.prototype.toString.call 返回 [object Type] 格式的字符串。

使用 typeof 操作符

typeof 是一个操作符,用于判断基本数据类型。它返回一个表示数据类型的字符串。

console.log(typeof 42); // "number" 

console.log(typeof 'hello'); // "string" 

console.log(typeof true); // "boolean" 

console.log(typeof undefined); // "undefined" 

console.log(typeof Symbol('id')); // "symbol" 

console.log(typeof 123n); // "bigint" 

console.log(typeof null); // "object" (这是一个已知的bug, null实际是一个原始类型) 

console.log(typeof { name: 'Alice' });// "object" 

console.log(typeof [1, 2, 3]); // "object" (数组是对象的一种) 

console.log(typeof function() {}); // "function"

使用 instanceof 操作符

instanceof 用于判断某个对象是否是某个构造函数的实例。

console.log({} instanceof Object); // true 

console.log([] instanceof Array); // true 

console.log(function() {} instanceof Function); // true

使用 Array.isArray

判断一个值是否为数组,推荐使用 Array.isArray。

console.log(Array.isArray([1, 2, 3])); // true 

console.log(Array.isArray({})); // false

使用 Object.prototype.toString

这种方法可以更准确地判断某些类型。

function getType(value) { return Object.prototype.toString.call(value); } 

console.log(getType(42)); // "[object Number]" 

console.log(getType('hello')); // "[object String]" 

console.log(getType(true)); // "[object Boolean]" 

console.log(getType(undefined)); // "[object Undefined]" 

console.log(getType(null)); // "[object Null]" 

console.log(getType(Symbol('id')); // "[object Symbol]" 

console.log(getType(123n)); // "[object BigInt]" 

console.log(getType({ name: 'Alice' });// "[object Object]" 

console.log(getType([1, 2, 3])); // "[object Array]" 

console.log(getType(function() {})); // "[object Function]" 

console.log(getType(new Date())); // "[object Date]" 

console.log(getType(/regex/)); // "[object RegExp]"

6、创建对象有几种方法?
  1. 对象字面量:简单直接,适用于静态对象。
  2. Object 构造函数:传统但不常用。
  3. 构造函数:适用于需要初始化逻辑的对象。
  4. Object.create:用于创建具有特定原型的对象。
  5. 类(ES6):现代的面向对象编程方式。
  6. 工厂函数:灵活的对象创建方式。
  7. Object.assign:用于合并对象或复制对象。
  8. Object.fromEntries:将键值对列表转换为对象。

1. 对象字面量

这是最简单和最常用的方法。

let obj = { name: 'Alice', age: 25 };

2. 使用 Object 构造函数

通过 new Object() 创建一个新的对象。

let obj = new Object(); 

obj.name = 'Alice'; 

obj.age = 25;

3. 使用构造函数

自定义一个构造函数,然后使用 new 关键字创建对象。

function Person(name, age) { this.name = name; this.age = age; } 

let alice = new Person('Alice', 25);

4. 使用 Object.create 方法

Object.create 方法创建一个新对象,使用现有的对象作为新对象的原型。

let personProto = { greet: function() { console.log('Hello, ' + this.name); } }; 

let alice = Object.create(personProto); 

alice.name = 'Alice'; 

alice.age = 25; 

alice.greet(); // 输出: Hello, Alice

5. 使用类(ES6)

ES6 引入了类的语法糖,用于创建对象。

class Person { 

    constructor(name, age) { 

        this.name = name; this.age = age; 

    } greet() { 

        console.log('Hello, ' + this.name); 

    } 
} 

let alice = new Person('Alice', 25); 

alice.greet(); // 输出: Hello, Alice

6. 工厂函数

工厂函数是返回对象的普通函数,不使用 new 关键字。

function createPerson(name, age) { 

     return { 

        name: name, age: age, 

        greet: function() { 

        console.log('Hello, ' + this.name); 

        } }; 

    } 

let alice = createPerson('Alice', 25); 

alice.greet(); // 输出: Hello, Alice

7. 使用 ES6 中的 Object.assign

Object.assign 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

let obj = Object.assign({}, { name: 'Alice', age: 25 });

8. 使用 Object.fromEntries(ES10)

Object.fromEntries 方法将一个键值对列表(通常是一个数组)转换为一个对象。

let entries = [['name', 'Alice'], ['age', 25]]; 

let obj = Object.fromEntries(entries); 

console.log(obj); // 输出: { name: 'Alice', age: 25 }

7、创建函数的几种方式 ?
  1. 函数声明:适用于函数需要在定义前调用的场景。
  2. 函数表达式:适用于函数作为值或需要在定义后调用的场景。
  3. 箭头函数:适用于简短的函数和不需要 this 绑定的场景。
  4. 匿名函数:适用于临时使用的函数,如回调函数。
  5. 构造函数:适用于动态创建函数,但通常不推荐使用。
  6. 方法定义:适用于在对象或类中定义方法。

1. 函数声明(Function Declaration)

这是最常见的创建函数的方式。函数声明会被提升(hoisted),即可以在定义之前调用。

function greet() { 

    console.log('Hello, world!'); 

} greet(); // 输出: Hello, world!

2. 函数表达式(Function Expression)

函数表达式将一个函数赋值给一个变量。函数表达式不会被提升,因此只能在定义之后调用。

const greet = function() { 

    console.log('Hello, world!'); 

}; greet(); // 输出: Hello, world!

3. 箭头函数(Arrow Function)

箭头函数是 ES6 引入的一种更简洁的函数定义方式,适用于简短的函数。箭头函数不会有自己的 this,arguments,super,或 new.target 绑定。

const greet = () => { 

    console.log('Hello, world!'); 

}; greet(); // 输出: Hello, world!

如果箭头函数只有一个表达式,可以省略花括号和 return 关键字:

const add = (a, b) => a + b; 

console.log(add(2, 3)); // 输出: 5

4. 匿名函数(Anonymous Function)

匿名函数没有名字,通常作为参数传递给其他函数或立即执行。

作为参数传递

setTimeout(function() { 

    console.log('Hello, world!'); 

}, 1000);

立即执行函数表达式(IIFE)

立即执行函数表达式在定义后立即执行。

(function() { console.log('Hello, world!'); })();

5. 构造函数(Function Constructor)

通过 Function 构造函数创建新的函数。这种方法较少使用,因为不如前面的方式直观,并且在某些情况下会有性能问题。

const add = new Function('a', 'b', 'return a + b'); 

console.log(add(2, 3)); // 输出: 5

6. 方法定义(Method Definition)

在对象中定义方法。可以通过对象字面量或类(ES6)定义方法。

对象字面量

const obj = { greet: function() { 

    console.log('Hello, world!'); 

} }; obj.greet(); // 输出: Hello, world!

类(ES6)

class Person { greet() { 

    console.log('Hello, world!'); 

} } 

const person = new Person(); 

person.greet(); // 输出: Hello, world!

8、=== 和 ==的区别?

`==` 会进行类型转换后再比较,可能会返回 `true`,即使两个值类型不同。
`===` 不进行类型转换,类型不同直接返回 `false`,只有类型和值都相同才返回 `true`。

在 JavaScript 中,`==` 和 `===` 是两种比较运算符,用于比较两个值。它们的主要区别在于是否进行类型转换。

`==` (宽松比较)

`==` 运算符在比较两个值之前,会进行类型转换(type coercion),然后再进行比较。它尝试将两个值转换为相同的类型,然后再比较它们。

console.log(5 == '5'); // true

console.log(0 == false); // true

console.log(null == undefined); // true

console.log('' == false); // true

`===` (严格比较)

`===` 运算符在比较两个值时,不进行类型转换。如果两个值的类型不同,直接返回 `false`。只有当两个值的类型和值都相同时,才会返回 `true`。

console.log(5 === '5'); // false

console.log(0 === false); // false

console.log(null === undefined); // false

console.log('' === false); // false

console.log(5 === 5); // true

console.log('hello' === 'hello'); // true

9、请指出 JavaScript 宿主对象和原生对象的区别?
  • 原生对象是 JavaScript 语言自身的一部分,由 ECMAScript 规范定义,在任何 ECMAScript 实现中都存在。
  • 宿主对象是由 JavaScript 运行的宿主环境(如浏览器或 Node.js)提供的,允许 JavaScript 与宿主环境的特性和功能交互。

在 JavaScript 中,宿主对象(Host Objects)和原生对象(Native Objects,也称为内置对象,Built-in Objects)是两个重要的概念。

原生对象(Native Objects)

原生对象是由 ECMAScript 规范定义的对象,它们是 JavaScript 语言的一部分,在任何实现 ECMAScript 的环境中都可以使用。这些对象在 JavaScript 运行时环境中自动可用。

常见的原生对象包括:

  1. 基本包装对象:Object, Function, Boolean, Symbol, Error
  2. 数值和日期对象:Number, BigInt, Math, Date
  3. 字符串处理对象:String, RegExp
  4. 集合和结构对象:Array, Set, Map, WeakSet, WeakMap
  5. 类型数组和缓冲区对象:ArrayBuffer, DataView, TypedArray (如 Int8Array, Uint8Array, Float32Array 等)
  6. 其他:JSON, Promise, Reflect, Proxy

这些对象和构造函数在 JavaScript 引擎启动时被自动加载,不依赖于宿主环境(例如浏览器或 Node.js)。

宿主对象(Host Objects)

宿主对象是由宿主环境(Host Environment)提供的对象,用于与宿主环境的特性和能力交互。宿主环境是 JavaScript 运行的外部环境,如浏览器、Node.js、嵌入式设备等。宿主对象的可用性和功能取决于具体的宿主环境。

在浏览器环境中的常见宿主对象:

  1. 文档对象模型(DOM):window, document, HTMLElement, NodeList, Event, localStorage
  2. 浏览器特性:XMLHttpRequest, fetch, alert, console
  3. Web API:Canvas, WebSocket, ServiceWorker

在 Node.js 环境中的常见宿主对象:

  1. 全局对象:global, process, Buffer
  2. 模块和文件系统:require, module, fs, path
  3. 其他内置模块:http, https, os

主要区别

  1. 定义来源:原生对象:由 ECMAScript 规范定义,任何 ECMAScript 实现中都存在。宿主对象:由宿主环境定义,根据不同的宿主环境而变化。
  2. 可用性:原生对象:在所有 ECMAScript 环境中都可用。宿主对象:仅在特定的宿主环境中可用。
  3. 作用范围: 原生对象:语言层面,提供基本的数据结构和方法。宿主对象:环境层面,提供与环境特性和 API 的交互。
  4. 示例:原生对象:Array, Object, Function, Date  宿主对象(浏览器):window, document, fetch  宿主对象(Node.js):global, process, fs

10、]avaScript 内置的常用对象有哪些?并列举该对象常用的方法?

1. Object

Object 是所有 JavaScript 对象的基类,所有对象从 Object 继承方法和属性。

常用方法:

  • Object.create(proto[, propertiesObject]):使用指定的原型对象和属性创建一个新的对象。
  • Object.assign(target, ...sources):将所有可枚举的属性的值从一个或多个源对象复制到目标对象。
  • Object.keys(obj):返回一个包含对象自身可枚举属性名称的数组。
  • Object.values(obj):返回一个包含对象自身可枚举属性值的数组。
  • Object.entries(obj):返回一个包含对象自身可枚举属性键值对的数组。
  • Object.freeze(obj):冻结对象,防止修改其属性。
  • Object.seal(obj):密封对象,防止添加新属性。

2. Array

Array 用于存储有序的元素集合。

常用方法:

  • Array.prototype.push(...items):向数组末尾添加一个或多个元素,并返回新的长度。
  • Array.prototype.pop():移除并返回数组的最后一个元素。
  • Array.prototype.shift():移除并返回数组的第一个元素。
  • Array.prototype.unshift(...items):向数组开头添加一个或多个元素,并返回新的长度。
  • Array.prototype.concat(...arrays):合并两个或多个数组,并返回一个新数组。
  • Array.prototype.slice([begin[, end]]):返回数组的一个浅拷贝,从 begin 到 end(不包括 end)。
  • Array.prototype.splice(start, deleteCount, ...items):通过删除或替换现有元素或者添加新元素来修改数组。
  • Array.prototype.forEach(callback[, thisArg]):对数组的每个元素执行一次提供的函数。
  • Array.prototype.map(callback[, thisArg]):创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。
  • Array.prototype.filter(callback[, thisArg]):创建一个新数组,其中包含所有通过提供函数测试的元素。
  • Array.prototype.reduce(callback[, initialValue]):对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行),将其结果汇总为单个返回值。

3. String

String 用于表示和操作文本。

常用方法:

  • String.prototype.charAt(index):返回指定索引位置的字符。
  • String.prototype.concat(...strings):连接两个或多个字符串,并返回一个新字符串。
  • String.prototype.includes(searchString[, position]):判断一个字符串是否包含在另一个字符串中。
  • String.prototype.indexOf(searchValue[, fromIndex]):返回字符串中第一个匹配项的索引。
  • String.prototype.slice(beginIndex[, endIndex]):提取字符串的一部分,并返回一个新的字符串。
  • String.prototype.split([separator[, limit]]):将一个字符串分割成一个字符串数组。
  • String.prototype.toLowerCase():将字符串转换为小写。
  • String.prototype.toUpperCase():将字符串转换为大写。
  • String.prototype.trim():去除字符串两端的空白字符。

4. Number

Number 用于表示数字。

常用方法:

  • Number.isFinite(value):判断值是否为有限数。
  • Number.isInteger(value):判断值是否为整数。
  • Number.isNaN(value):判断值是否为 NaN。
  • Number.parseFloat(string):将字符串解析为浮点数。
  • Number.parseInt(string[, radix]):将字符串解析为整数。

5. Boolean

Boolean 用于表示布尔值(true 或 false)。

常用方法:

  • Boolean.prototype.toString():返回布尔值的字符串表示("true" 或 "false")。

6. Math

Math 提供了数学常数和函数。

常用方法:

  • Math.abs(x):返回数的绝对值。
  • Math.ceil(x):向上舍入。
  • Math.floor(x):向下舍入。
  • Math.max(...values):返回一组数中的最大值。
  • Math.min(...values):返回一组数中的最小值。
  • Math.random():返回一个 [0, 1) 之间的随机数。
  • Math.round(x):四舍五入。
  • Math.sqrt(x):返回数的平方根。

7. Date

Date 用于处理日期和时间。

常用方法:

  • Date.now():返回自1970年1月1日 00:00:00 UTC到当前时间的毫秒数。
  • Date.prototype.getFullYear():返回日期的年份。
  • Date.prototype.getMonth():返回日期的月份(0-11)。
  • Date.prototype.getDate():返回日期的日(1-31)。
  • Date.prototype.getHours():返回日期的小时(0-23)。
  • Date.prototype.getMinutes():返回日期的分钟(0-59)。
  • Date.prototype.getSeconds():返回日期的秒(0-59)。
  • Date.prototype.getTime():返回1970年1月1日至今的毫秒数。

8. RegExp

RegExp 用于匹配文本模式。

常用方法:

  • RegExp.prototype.exec(string):在字符串中执行查找匹配的正则表达式,并返回一个数组(或 null)。
  • RegExp.prototype.test(string):测试一个字符串是否匹配正则表达式。
  • String.prototype.match(regexp):在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

9. JSON

JSON 用于解析和序列化 JSON 数据。

常用方法:

  • JSON.parse(text[, reviver]):解析 JSON 字符串,生成 JavaScript 值或对象。
  • JSON.stringify(value[, replacer[, space]]):将 JavaScript 对象或值序列化为 JSON 字符串。
  • 52
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
不定项选择题(共14题,单选或多选): 一、一个HTML文档必须包含三个元素,它们是head、html和( )。 A.scriptB.bodyC.titleD.link 二、下面哪段javascript能弹出一个提示框?( ) A.document.alert(test) B.window.alert(test) C.document.alert('test ') D.window.alert('test ') 三、当鼠标放在一个链接上的css样式应该( )伪类来定义。 A.a:visitedB.a:linkC.a:hoverD.a:active 四、关于ASP.NET中的代码隐藏文件的描述正确的是( )。 A.Web窗体页的程序的逻辑由代码组成,这些代码的创建用于与窗体交互。该文件称作为“代码隐藏”文件,如果用C#创建,该文件将具有“.ascx.cs”扩展名 B.web窗体也是类 C.项目中所有的Web窗体页的代码隐藏文件都被编译成项目动态链接库(.dll)文件 D.以上都不正确 五、下列ASP.NET语句( )正确地创建了一个与SQL Server数据库的连接。 A.SqlConnection con1 = new Connection(“Data Source = localhost; Trusted_Connection =Yes; Initial Catalog = myDB”); B.SqlConnection con1 = new SqlConnection(“Data Source = localhost; Trusted_Connection =Yes; Initial Catalog = myDB”); C.SqlConnection con1 = new OleDbConnection(“Data Source = localhost; Trusted_Connection =Yes; Initial Catalog = myDB”); D.SqlConnection con1 = new SqlConnection(Data Source = localhost; Trusted_Connection =Yes; Initial Catalog = myDB); 六、执行一次无返回值的数据删除,必须用到下面哪些对象? ( ) A.SqlConnectionB.SqlDataAdapterC.SqlCommandD.SqlDataReader 七、在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是( ) A.insert、update、delete等操作的Sql语句主要用ExecuteNonQuery()方法来执行; B.ExecuteNonQuery()方法返回执行Sql语句所影响的行数。 C.Select操作的Sql语句只能由ExecuteReader()方法来执行; D.ExecuteReader()方法返回一个DataReder对象; 八、ASP.NET有多种维护状态的技术,以下哪种是保存在客户端的?( ) A.VIEWSTATEB.SESSIONC.APPLICATIOND.数据CACHE 九、Cookies的默认生命周期有多长? ( ) A.20分钟B.30分钟C. 一天D.随浏览器的关闭而失效 十、int[][] myArray=new int[3][]{ new int[3]{ 5, 6, 2 }, new int[5]{ 6, 9, 7, 8, 3 }, new int[2]{ 3, 2 }}; myArray[2][2]的值是( ) A.9B.2C.6D.越界 十一、要为做了输出缓存的页面实现即时判断用户IP来路,可在以下哪种事件中实现? ( ) A.Page.InitB.HttpApplication.BeginRequest C.Page.LoadD.以上都不是 十二、下面哪个SQL语句完全正确( ) A.Select count(*) from (select top 10 * from table order by bb) tb group by cc B.update set bb = bb + 1 from table C.Select count(*) from (select distinct * from table) tb group by cc D.delete * from table 十三、为了实现a.aspx的URL重写,下面哪个正则表达式替换可以实现?( ) A. Regex.Replace(sUrl, @“/(\d+).aspx”, “a.aspx?ID=$0”, RegexOptions.IgnoreCase) B. Regex.Replace(sUrl, @“/(\d+).aspx”, “/a.aspx?ID=$0”, RegexOptions.IgnoreCase) C. Regex.Replace(sUrl, @“/(\d+).aspx”, “a.aspx?ID=$1”, RegexOptions.IgnoreCase) D. Regex.Replace(sUrl, @“/(\d+).aspx”, “/a.aspx?ID=$1”, RegexOptions.IgnoreCase) 十四、下面javascript代码的输出结果是( ) var aa = new Array(1, 2, 4, 5, 3, 6); var c = 0; for (var i = 0; i < aa.length; ++i){ c += aa.pop(); } document.write(c); 提示:Array.pop()函数将数组内最后一个元素移除并返回该元素 A.7 B.14 C.21 D.以上皆不正确 填空题(共4题): 一、C#中判断整型变量k是否偶数的语句: 二、有这样的枚举定义:public enum TrainType{ 空调, 快速, 新型, 卧铺 },为实现它的按位组合,你会分别赋予它们什么值?请用逗号按顺序分隔开 三、C#中为了防止非本程序集的代码访问,可以用什么关键字修饰类或者类成员? 四、为了将table表内bb(datetime类型)字段的数据按年月降序输出,对应的SQL语句为 选择题答案: 1.B,2.D,3.C,4.BC,5.B,6.AC,7.C,8.A,9.D,10.D,11.B,12.AC,13.D,14.B 填空题答案: 1.(k & 1) == 0 或 k % 2 == 0 2.1,2,4,8(答案不定,看情况) 3.internal 4.select * from table order by year(bb) desc, month(bb) desc 1.new有几种用法 第一种:new Class(); 第二种:覆盖方法 public new XXXX(){} 第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。 2.如何把一个array复制到arrayList里 foreach( object o in array )arrayList.Add(o); 3.datagrid.datasouse可以连接什么数据源 [dataset,datatable,dataview] dataset,datatable,dataview , IList 4.概述反射和序列化 反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性 序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。 5.概述o/r mapping 的原理 利用反射,配置 将类于数据库表映射 6.类成员有( )种可访问形式 可访问形式?不懂。 可访问性:public ,protected ,private,internal 7.用sealed修饰的类有什么特点 sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。 密封类不能同时为抽象类。 sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。 8.列举ADO.NET中的五个主要对象,并简单描述 connection,command,dataReader,trans,dataset ... 9.执行下面代码后: String strTemp ="abcdefg 某某某"; Int i System.Text.Encoding.Default.GetBytes(strTemp).Length; Int j = strTemp.Length; 问:i=(14 ) ;j=(11 ) i=(14 ) ;j=(11 ) 中文两个字节 10.C#中,string str = null 与 string str ="",请尽量用文字说明区别。(要点:说明详细的内存空间分配) string str ="" 分配空间 11.详述.NET里class和struct的异同! class:放在 ? struct放在? struct值传递 类与结构有很多相似之处:结构可以实现接口,并且可以具有与类相同的成员类型。然而,结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承。结构的值存储在“在堆栈上”或“内联”。细心的程序员有时可以通过聪明地使用结构来增强性能。 12.概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。 远程逻辑调用,remoing接口只能用在.net中 13.什么是code-behind技术 aspx and cs 14.概述三层结构体系 web/business/dataaccess 15.asp.net如何实现MVC模式,举例说明! web/business/dataaccess ---------------------------------------------------------------------------------------------------------- 1.面向对象的思想主要包括什么? 答:这个题范围太广,不知道说什么. 2.什么是ASP.net中的用户控件 答:用户控件就是.ascx扩展名的东西喽,可以拖到不同的页面中调用,以节省代码.比如登陆可能在多个页面上有,就可以做成用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方法调整. 3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释? 答:装箱就是把值类型转成引用类型,从MS IL角度看好像是boxing,没记错的话是把值从堆栈转到堆中.拆箱相反,重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚. 4.列举一下你所了解的XML技术及其应用 答:XML可是好东西,保存配置,站与站之间的交流,WEB SERVICE都要用它. 5.值类型和引用类型的区别?写出C#的样例代码。 答:结构是值类型,类是引用类型,所以传结构就是值类型的应用啦,传对象或类就是引用类型的,这个不用多写了吧. 6.ADO.net中常用的对象有哪些?分别描述一下。 答:connection command sqladapter dataset datatable dataview等等.写不完了. 7.如何理解委托? 答:据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法. msdn2005中是这样解释的: 委托具有以下特点: 委托类似于 C++ 函数指针,但它是类型安全的。 委托允许将方法作为参数进行传递。 委托可用于定义回调方法。 委托可以链接在一起;例如,可以对一个事件调用多个方法。 方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。 C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。 8.C#中的接口和类有什么异同。 答:这个异同可多了,要说清楚还真不容易. 9.。net中读写数据库需要用到哪些类?他们的作用 答:这个类自已可以写的啊,你是指基类吗?那configuration,sqlconnection,sqlcommand等都要用到. 10.UDP连接和TCP连接的异同。 答:前者只管传,不管数据到不到,无须建立连接.后者保证传输的数据准确,须要连结. 11.ASP.net的身份验证方式有哪些?分别是什么原理? 答:form认证,windows集成认证等,原理不清楚. 12.进程和线程分别怎么理解? 答:进程是老子,线程是儿子,没有老子就没有儿子,一个老子可以有多个儿子.一个儿子可以成为别人的儿子,一个老子也可以为别的老子生儿子. 13.什么是code-Behind技术。 答:代码分离,这是个明智的东西,像ASP这样混成一堆很不爽.或者可以理解成HTML代码写在前台,C#代码写在后台.当然前台也有脚本,类的调用等,其实写在一起也是可以的. 14.活动目录的作用。 答:这个不明白.请明白的补充一下. 15..net中读写XML的类都归属于哪些命名空间? 答:System.Xml 我自已写的就不一定了,嘿嘿. 16.解释一下UDDI、WSDL的意义及其作用。 答:什么东西? 17.什么是SOAP,有哪些应用。 答:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息,具体请看:http://playist.blogchina.com/2521621.html 18.如何部署一个ASP.net页面。 答:随便啦,想直接上传就直接上传,想打包成EXE就打包,看个人喜好. 19.如何理解.net中的垃圾回收机制。 答:GC?对象创建了总要清除啊,不然内存哪够用?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不熬夜的臭宝

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值