ES6 template string模板字符串

在ES6中,JS除了传统的字符串,提供了新的template string模板字符串。

Ex:普通的字符串:

1
2
3
4
var firstName = 'Jake';
var lastName = 'Rawr';
console.log('My name is ' + firstName + ' ' + lastName);
// My name is Jake Rawr

template string模板字符串:

1
2
3
4
var firstName = 'Jake';
var lastName = 'Rawr';
console.log(`My name is ${firstName} ${lastName}`);
// My name is Jake Rawr

Read More

使用unity创建塔防游戏(译)(part1)

塔防游戏非常地受欢迎,木有什么能比看着自己的防御毁灭邪恶的入侵者更爽的事了。
在这个包含两部分的教程中,你将使用Unity创建一个塔防游戏。

你将会学到如何:

  • 创建一波一波的敌人
  • 使敌人随着路标移动
  • 创建和升级防御塔,并将敌人销毁

最后,你会有一个此类型游戏的框架,之后可在此基础之上进行扩展。
img

Read More

react-native中DrawerLayoutAndroid的基本使用

本文记录在react-native中DrawerLayoutAndroid的基本使用,主要是为了解决导航菜单显示问题。

本文做练习用的工程来自上一篇文章 react-native中navigator的基本使用

首先,官方文档地址如下:
http://facebook.github.io/react-native/docs/drawerlayoutandroid.html#content

DrawerLayoutAndroid组件通过其名字就能知道,只能在android系统上使用(好像是废话)。
该组件使用renderNavigationView方法来渲染Drawer(一般用来导航)。
该组件的直接子元素是主视图,用来显示内容。

在一开始,导航视图是被隐藏的,但是可以被从窗体的侧边拉出来(是的,就像抽屉一样),具体的从窗体哪个方向拉,可以通过drawerPosition属性指定,同时拉出来的宽度(抽屉的深度)可以通过drawerWidth属性指定。

Read More

react-native中navigator的基本使用

本文记录在react-native中navigator的基本使用,解决了页面间如何切换的问题。

注: 本文是windows环境下开发android

首先,官方文档地址如下:
http://facebook.github.io/react-native/docs/navigator.html#content

从官方文档可以看到navigator的基本用法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<Navigator
initialRoute={{name: 'My First Scene', index: 0}}
renderScene={(route, navigator) =>
<MySceneComponent
name={route.name}
onForward={() => {
var nextIndex = route.index + 1;
navigator.push({
name: 'Scene ' + nextIndex,
index: nextIndex,
});
}}
onBack={() => {
if (route.index > 0) {
navigator.pop();
}
}}
/>
}
/>

从中可以看到两个最基本和必须的属性如下:

  • initialRoute : 该属性指明了一开始的初始路由,即app加载时第一次要展现什么内容
  • renderScene : 渲染场景函数,根据route参数确定显示哪些内容

另外还经常会用到的可选属性有:

  • configureScene: 场景配置函数,允许配置场景相关的动画和手势

Read More

在ES6函数中模拟必选参数

在多数编程语言中,函数的参数默认都是必选的,开发者必选要显示的声明参数的可选项。
在js中,所有的参数都是可选的。

但是我们可以利用ES6中的参数默认值的特性,在不改变函数体的情况下确保参数的必选性。

上代码:

1
2
3
4
5
6
7
8
const _err = function( message ){
throw new Error( message );
}
const getSum = (a = _err('a is not defined'), b = _err('b is not defined')) => a + b
getSum( 10 ) // throws Error, b is not defined
getSum( undefined, 10 ) // throws Error, a is not define

_err是一个立即抛出异常的函数,当没有给函数中的一个参数赋值时,默认值将被使用,所以_err会被调用同时抛出一个异常。

本文是js tips系列,翻译自 https://github.com/loverajoel/jstips

javascript中的Hoisting(变量提升)(吊装)

理解hoisting(变量提升)能帮助你更好的组织你的函数作用域。

要时刻记住,变量的声明和函数定义会被提升(hoisting)到函数作用域的顶部

变量的定义(definition)不会被提升,即使你是在同一行同时声明和定义一个变量。

变量声明(declaration)是让系统知道某个变量的存在,而变量定义(definiton)是给变量赋值。

Read More

检查对象中是否存在某个属性

当需要检查某个属性是否在一个对象中时,你可能会像下面这样子做:

1
2
3
4
5
6
7
var myObject = {
name: 'hello'
};
if(typeof myObject['name'] !== 'undefined') {...}
if(myObject['name']){...}

上面的方法没有问题,但是你应该知道有两个原生的方法可以做这类事情, Object.inObject.hasOwnProperty, 每个对象都是Object的子类,所以都已经有了这两个方法

Read More

向数组中插入一个元素

向现有数组中插入一个元素是经常会见到的一个需求。你可以:

使用push将元素插入到数组的尾部;
使用unshift将元素插入到数组的头部;
使用splice将元素插入到数组的中间;

上面那些方法都是常见的方法,但并不意味着没有性能更好的方法,比如:

Read More